├── .dockerignore ├── .github └── workflows │ └── docker-image.yml ├── .gitignore ├── .gitmodules ├── .prettierrc ├── .yarnrc.yml ├── Dockerfile ├── LICENSE ├── README.md ├── controllers ├── github.ts ├── memo.ts ├── query.ts ├── user.ts └── wx.ts ├── helpers ├── DBHelper.ts ├── Error.ts ├── config.ts └── utils.ts ├── middlewares ├── authCheck.ts └── errorHandler.ts ├── models ├── MemoModel.ts ├── QueryModel.ts └── UserModel.ts ├── package.json ├── resources ├── memos.db └── sqlite.sql ├── roadmap.md ├── routers ├── github.ts ├── memo.ts ├── query.ts ├── user.ts └── wx.ts ├── scripts └── build.sh ├── server.ts ├── tsconfig.json ├── typings └── basic.d.ts └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Git 4 | .git 5 | .gitattributes 6 | .gitignore 7 | .github 8 | 9 | # Dependency 10 | node_modules 11 | .yarn 12 | 13 | # build/ 14 | resources 15 | build 16 | -------------------------------------------------------------------------------- /.github/workflows/docker-image.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: 6 | - "master" 7 | 8 | jobs: 9 | docker: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | with: 14 | submodules: true 15 | 16 | - name: Login to Docker Hub 17 | uses: docker/login-action@v1 18 | with: 19 | username: ${{ secrets.DOCKER_NEOSMEMO_USERNAME }} 20 | password: ${{ secrets.DOCKER_NEOSMEMO_TOKEN }} 21 | 22 | - name: Set up Docker Buildx 23 | id: buildx 24 | uses: docker/setup-buildx-action@v1 25 | 26 | - name: Build and push 27 | id: docker_build 28 | uses: docker/build-push-action@v2 29 | with: 30 | context: ./ 31 | file: ./Dockerfile 32 | push: true 33 | tags: ${{ secrets.DOCKER_NEOSMEMO_USERNAME }}/memos:latest 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "web"] 2 | path = web 3 | url = git@github.com:boojack/insmemo-web.git 4 | branch = dist 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 140, 3 | "useTabs": false, 4 | "semi": true, 5 | "singleQuote": false 6 | } 7 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | 3 | WORKDIR /usr/src/app 4 | ENV TZ=Asia/Shanghai 5 | 6 | COPY . . 7 | 8 | RUN yarn 9 | RUN yarn build 10 | 11 | CMD ["node", "./build/server.js"] 12 | 13 | EXPOSE 8080 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Memos 2 | 3 | 一个碎片化知识记录工具。 4 | 5 | 私有化部署请参考:[docker image](https://hub.docker.com/r/neosmemo/memos) 6 | 7 | --- 8 | 9 | 为何做这个? 10 | 11 | - 用于记录:📅 每日/周计划、💡 突发奇想、📕 读后感... 12 | - 代替了我在微信上经常使用的“文件传输助手”; 13 | - 打造一个属于自己的轻量化“卡片”笔记簿; 14 | 15 | 有何特点呢? 16 | 17 | - ✨ 开源项目; 18 | - 😋 精美且细节的视觉样式; 19 | - 📑 体验优良的交互逻辑; 20 | 21 | --- 22 | 23 | Enjoy it and have fun~ 24 | -------------------------------------------------------------------------------- /controllers/github.ts: -------------------------------------------------------------------------------- 1 | import { Context } from "koa"; 2 | import axios from "axios"; 3 | import querystring from "querystring"; 4 | import { githubOAuthConfig } from "../helpers/config"; 5 | import utils from "../helpers/utils"; 6 | import { UserModel } from "../models/UserModel"; 7 | 8 | interface GithubUserInfo { 9 | id: number; 10 | login: string; 11 | name: string; 12 | } 13 | 14 | export namespace GithubController { 15 | export async function oauth(ctx: Context) { 16 | const { code } = ctx.query; 17 | const tokenRes = await axios.get( 18 | `https://github.com/login/oauth/access_token?client_id=${githubOAuthConfig.clientId}&client_secret=${githubOAuthConfig.clientSecret}&code=${code}` 19 | ); 20 | const accessToken = querystring.parse(tokenRes.data).access_token as string; 21 | 22 | if (!accessToken) { 23 | throw new Error("20010"); 24 | } 25 | 26 | const ghUserRes = await axios.get(`https://api.github.com/user`, { 27 | headers: { 28 | Authorization: "token " + accessToken, 29 | }, 30 | }); 31 | const ghUser = ghUserRes.data as GithubUserInfo; 32 | 33 | if (!ghUser) { 34 | throw new Error("20010"); 35 | } 36 | 37 | // 如果已经登录,则更新绑定信息 38 | const userId = ctx.session?.userId as string; 39 | 40 | if (userId) { 41 | const githubNameUsable = await UserModel.checkGithubnameUsable(ghUser.login); 42 | if (!githubNameUsable) { 43 | throw new Error("20011"); 44 | } 45 | await UserModel.updateUser(userId, undefined, undefined, ghUser.login); 46 | } 47 | 48 | let user = await UserModel.getUserByGhName(ghUser.login); 49 | 50 | if (user === null) { 51 | // 创建新用户,防止用户名重复 52 | let username = ghUser.name; 53 | let usernameUsable = await UserModel.checkUsernameUsable(username); 54 | while (!usernameUsable) { 55 | username = ghUser.name + utils.genUUID(); 56 | usernameUsable = await UserModel.checkUsernameUsable(username); 57 | } 58 | user = await UserModel.createUser(username, username, ghUser.login); 59 | } 60 | 61 | ctx.session!.userId = user.id; 62 | 63 | ctx.redirect(githubOAuthConfig.redirectUri); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /controllers/memo.ts: -------------------------------------------------------------------------------- 1 | import { Context } from "koa"; 2 | import utils from "../helpers/utils"; 3 | import { MemoModel } from "../models/MemoModel"; 4 | 5 | export namespace MemoController { 6 | // example: /api/memo/all 7 | export async function getAllMemos(ctx: Context) { 8 | const userId = ctx.session?.userId as string; 9 | const memos = await MemoModel.getAllMemosByUserId(userId); 10 | 11 | ctx.body = { 12 | succeed: true, 13 | data: memos, 14 | }; 15 | } 16 | 17 | export async function getDeletedMemos(ctx: Context) { 18 | const userId = ctx.session?.userId as string; 19 | 20 | const memos: any[] = await MemoModel.getDeletedMemosByUserId(userId); 21 | 22 | ctx.body = { 23 | succeed: true, 24 | data: memos, 25 | }; 26 | } 27 | 28 | // get memo by id 29 | export async function getMemoById(ctx: Context) { 30 | const { id } = ctx.query; 31 | 32 | if (!utils.isString(id)) { 33 | throw new Error("30001"); 34 | } 35 | 36 | const memo = await MemoModel.getMemoById(id as string); 37 | 38 | ctx.body = { 39 | succeed: true, 40 | data: memo, 41 | }; 42 | } 43 | 44 | // get linked memos 45 | export async function getLinkedMemosById(ctx: Context) { 46 | const userId = ctx.session?.userId as string; 47 | const { memoId } = ctx.query; 48 | 49 | if (!utils.isString(memoId)) { 50 | throw new Error("30001"); 51 | } 52 | 53 | const memos = await MemoModel.getLinkedMemosById(userId, memoId as string); 54 | 55 | ctx.body = { 56 | succeed: true, 57 | data: memos, 58 | }; 59 | } 60 | 61 | // create memo 62 | export async function createMemo(ctx: Context) { 63 | const userId = ctx.session?.userId as string; 64 | const { content } = ctx.request.body; 65 | 66 | if (!utils.isString(content)) { 67 | throw new Error("30001"); 68 | } 69 | 70 | const memo = await MemoModel.createMemo(userId, content); 71 | 72 | ctx.body = { 73 | succeed: true, 74 | data: memo, 75 | }; 76 | } 77 | 78 | export async function hideMemo(ctx: Context) { 79 | const { memoId } = ctx.request.body; 80 | 81 | if (!utils.isString(memoId)) { 82 | throw new Error("30001"); 83 | } 84 | 85 | try { 86 | const nowTimeStr = utils.getDateTimeString(Date.now()); 87 | await MemoModel.updateMemoDeletedAt(memoId, nowTimeStr); 88 | } catch (error) { 89 | throw new Error("50002"); 90 | } 91 | 92 | ctx.body = { 93 | succeed: true, 94 | message: "delete memo succeed", 95 | }; 96 | } 97 | 98 | export async function restoreMemo(ctx: Context) { 99 | const { memoId } = ctx.request.body; 100 | 101 | if (!utils.isString(memoId)) { 102 | throw new Error("30001"); 103 | } 104 | 105 | try { 106 | await MemoModel.updateMemoDeletedAt(memoId, null); 107 | } catch (error) { 108 | throw new Error("50002"); 109 | } 110 | 111 | ctx.body = { 112 | succeed: true, 113 | message: "delete memo succeed", 114 | }; 115 | } 116 | 117 | export async function deleteMemo(ctx: Context) { 118 | const { memoId } = ctx.request.body; 119 | 120 | if (!utils.isString(memoId)) { 121 | throw new Error("30001"); 122 | } 123 | 124 | try { 125 | await MemoModel.deleteMemoByID(memoId); 126 | } catch (error) { 127 | throw new Error("50002"); 128 | } 129 | 130 | ctx.body = { 131 | succeed: true, 132 | message: "delete memo succeed", 133 | }; 134 | } 135 | 136 | export async function updateMemo(ctx: Context) { 137 | const { memoId, content } = ctx.request.body; 138 | 139 | if (!utils.isString(memoId) || !utils.isString(content)) { 140 | throw new Error("30001"); 141 | } 142 | 143 | const result = await MemoModel.updateMemoContent(memoId, content); 144 | if (!result) { 145 | throw new Error("50002"); 146 | } 147 | 148 | const data: IterObject = { 149 | id: memoId, 150 | content, 151 | }; 152 | 153 | ctx.body = { 154 | succeed: true, 155 | message: "update memo content succeed", 156 | data, 157 | }; 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /controllers/query.ts: -------------------------------------------------------------------------------- 1 | import { Context } from "koa"; 2 | import utils from "../helpers/utils"; 3 | import { QueryModel } from "../models/QueryModel"; 4 | 5 | export namespace QueryController { 6 | // create query 7 | export async function createQuery(ctx: Context) { 8 | const userId = ctx.session?.userId as string; 9 | const { querystring, title } = ctx.request.body; 10 | 11 | if (!utils.isString(querystring) || !utils.isString(title)) { 12 | throw new Error("30001"); 13 | } 14 | 15 | if (title === "" || querystring === "") { 16 | throw new Error("30001"); 17 | } 18 | 19 | let query = await QueryModel.getQueryByText(userId, querystring); 20 | if (!query) { 21 | query = await QueryModel.createQuery(userId, title, querystring); 22 | } 23 | 24 | ctx.body = { 25 | succeed: true, 26 | data: query, 27 | }; 28 | } 29 | 30 | export async function pinQuery(ctx: Context) { 31 | const { queryId } = ctx.request.body; 32 | 33 | if (!utils.isString(queryId)) { 34 | throw new Error("30001"); 35 | } 36 | 37 | const result = await QueryModel.pinQuery(queryId); 38 | 39 | ctx.body = { 40 | succeed: true, 41 | data: result, 42 | }; 43 | } 44 | 45 | export async function unpinQuery(ctx: Context) { 46 | const { queryId } = ctx.request.body; 47 | 48 | if (!utils.isString(queryId)) { 49 | throw new Error("30001"); 50 | } 51 | 52 | const result = await QueryModel.unpinQuery(queryId); 53 | 54 | ctx.body = { 55 | succeed: true, 56 | data: result, 57 | }; 58 | } 59 | 60 | // update query 61 | export async function updateQuery(ctx: Context) { 62 | const { queryId, querystring, title } = ctx.request.body; 63 | 64 | if (!utils.isString(queryId) || !utils.isString(querystring) || !utils.isString(title)) { 65 | throw new Error("30001"); 66 | } 67 | 68 | if (queryId === "" || title === "" || querystring === "") { 69 | throw new Error("30001"); 70 | } 71 | 72 | await QueryModel.updateQuery(queryId, title, querystring); 73 | const query = await QueryModel.getQueryById(queryId); 74 | 75 | ctx.body = { 76 | succeed: true, 77 | data: query, 78 | }; 79 | } 80 | 81 | // get my queries 82 | export async function getMyQueries(ctx: Context) { 83 | const userId = ctx.session?.userId as string; 84 | 85 | const queries = await QueryModel.getQueriesByUserId(userId); 86 | 87 | ctx.body = { 88 | succeed: true, 89 | data: queries, 90 | }; 91 | } 92 | 93 | // delete query 94 | export async function deleteQueryById(ctx: Context) { 95 | const { queryId } = ctx.request.body; 96 | 97 | if (!utils.isString(queryId)) { 98 | throw new Error("30001"); 99 | } 100 | 101 | await QueryModel.deleteQueryById(queryId); 102 | 103 | ctx.body = { 104 | succeed: true, 105 | data: true, 106 | }; 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /controllers/user.ts: -------------------------------------------------------------------------------- 1 | import { Context } from "koa"; 2 | import { UserModel } from "../models/UserModel"; 3 | 4 | export namespace UserController { 5 | /** 6 | * Get my userinfo 7 | * use for check sign in status 8 | */ 9 | export async function getMyUserInfo(ctx: Context) { 10 | const userId = ctx.session?.userId as string; 11 | const userinfo = await UserModel.getUserInfoById(userId); 12 | 13 | if (!userinfo) { 14 | ctx.body = { 15 | succeed: false, 16 | }; 17 | return; 18 | } 19 | 20 | // 数据去敏 21 | const data = userinfo as IterObject; 22 | delete data.password; 23 | 24 | ctx.body = { 25 | succeed: true, 26 | data, 27 | }; 28 | } 29 | 30 | export async function signup(ctx: Context) { 31 | const { username, password } = ctx.request.body; 32 | 33 | if (!username || !password) { 34 | throw new Error("30001"); 35 | } 36 | 37 | const usernameUsable = await UserModel.checkUsernameUsable(username); 38 | if (!usernameUsable) { 39 | throw new Error("20002"); 40 | } 41 | 42 | const user = await UserModel.createUser(username, password); 43 | 44 | if (!user) { 45 | throw new Error("20003"); 46 | } 47 | 48 | ctx.session!.userId = user.id; 49 | 50 | ctx.body = { 51 | succeed: true, 52 | message: "sign up succeed", 53 | }; 54 | } 55 | 56 | export async function signin(ctx: Context) { 57 | const { username, password } = ctx.request.body; 58 | 59 | if (!username || !password) { 60 | throw new Error("30001"); 61 | } 62 | 63 | const user = await UserModel.validSigninInfo(username, password); 64 | 65 | if (!user) { 66 | throw new Error("20004"); 67 | } 68 | 69 | ctx.session!.userId = user.id; 70 | 71 | ctx.body = { 72 | succeed: true, 73 | message: "sign in succeed", 74 | }; 75 | } 76 | 77 | export async function signout(ctx: Context) { 78 | ctx.session!.userId = null; 79 | 80 | ctx.body = { 81 | succeed: true, 82 | message: "sign out succeed", 83 | }; 84 | } 85 | 86 | export async function checkUsernameUsable(ctx: Context) { 87 | const { username } = ctx.query; 88 | 89 | if (!username) { 90 | throw new Error("30001"); 91 | } 92 | 93 | const usernameUsable = await UserModel.checkUsernameUsable(username as string); 94 | 95 | ctx.body = { 96 | succeed: true, 97 | data: usernameUsable, 98 | }; 99 | } 100 | 101 | export async function update(ctx: Context) { 102 | const userId = ctx.session?.userId as string; 103 | const { username, password, githubName, wxUserId } = ctx.request.body; 104 | 105 | await UserModel.updateUser(userId, username, password, githubName, wxUserId); 106 | 107 | ctx.body = { 108 | succeed: true, 109 | message: "update succeed", 110 | }; 111 | } 112 | 113 | export async function checkPassword(ctx: Context) { 114 | const userId = ctx.session?.userId as string; 115 | const { password } = ctx.request.body; 116 | 117 | if (!password) { 118 | throw new Error("30001"); 119 | } 120 | 121 | const isValid = await UserModel.validPassword(userId, password as string); 122 | 123 | ctx.body = { 124 | succeed: true, 125 | data: isValid, 126 | }; 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /controllers/wx.ts: -------------------------------------------------------------------------------- 1 | import { Context } from "koa"; 2 | import { parseStringPromise } from "xml2js"; 3 | import utils from "../helpers/utils"; 4 | import { MemoModel } from "../models/MemoModel"; 5 | import { UserModel } from "../models/UserModel"; 6 | 7 | const TOKEN = "insmemo0justsven0top"; 8 | 9 | export namespace WxController { 10 | export async function validate(ctx: Context) { 11 | const signature = ctx.query.signature; 12 | const timestamp = ctx.query.timestamp; 13 | const echostr = ctx.query.echostr; 14 | const nonce = ctx.query.nonce; 15 | 16 | const original = [nonce, timestamp, TOKEN].sort().join(""); 17 | const sha1Code = utils.getInsecureSHA1ofStr(original); 18 | 19 | if (signature === sha1Code) { 20 | ctx.body = echostr; 21 | } else { 22 | ctx.body = "wx validate error"; 23 | } 24 | } 25 | 26 | export async function handleWxMessage(ctx: Context) { 27 | const data = await parseStringPromise(ctx.request.body, { 28 | explicitArray: false, 29 | explicitRoot: false, 30 | }); 31 | 32 | let responseContent = ""; 33 | let userId = ""; 34 | let accountId = ""; 35 | 36 | if (data) { 37 | const wxUserId = data.FromUserName; 38 | userId = wxUserId; 39 | accountId = data.ToUserName; 40 | 41 | try { 42 | const user = await UserModel.getUserByWxUserId(wxUserId); 43 | if (user) { 44 | const msgType = data.MsgType; 45 | let content = ""; 46 | 47 | if (msgType === "text") { 48 | content = data.Content; 49 | } else if (msgType === "image") { 50 | content = data.PicUrl; 51 | } else if (msgType === "voice") { 52 | content = data.Recognition; 53 | } else if (msgType === "link") { 54 | const title = data.Title; 55 | const description = data.Description; 56 | const url = data.Url; 57 | content = `${title}\n${description}\n${url}`; 58 | } 59 | 60 | if (content) { 61 | await MemoModel.createMemo(user.id, content); 62 | responseContent = `保存成功 🎉`; 63 | } 64 | } else { 65 | responseContent = `请先绑定微信 id:${wxUserId}。`; 66 | } 67 | } catch (error) { 68 | responseContent = `Error: ${error}`; 69 | } 70 | } else { 71 | ctx.body = { 72 | success: false, 73 | msg: "data is null", 74 | }; 75 | return; 76 | } 77 | 78 | ctx.type = "application/xml"; 79 | ctx.method = "GET"; 80 | ctx.body = getWxApplyMsgXML(userId, accountId, responseContent); 81 | } 82 | 83 | function getWxApplyMsgXML(toUser: string, fromUser: string, content: string) { 84 | const time = Math.round(new Date().getTime() / 1000); 85 | 86 | return `${time}`; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /helpers/DBHelper.ts: -------------------------------------------------------------------------------- 1 | import { accessSync } from "fs"; 2 | import sqlite3 from "sqlite3"; 3 | import utils from "./utils"; 4 | 5 | // JUST FOR DEV 6 | const devDbFile = "/Users/sli4/Downloads/data/memos.db"; 7 | const userDbFile = process.env.NODE_ENV === "dev" ? devDbFile : "/data/memos.db"; 8 | 9 | function getDbInstance() { 10 | let temp: sqlite3.Database; 11 | 12 | try { 13 | accessSync(userDbFile); 14 | temp = new sqlite3.Database(userDbFile, (err) => { 15 | if (err) { 16 | console.error(err.message); 17 | } else { 18 | console.log("Connected to the user database."); 19 | } 20 | }); 21 | } catch (error) { 22 | console.log("/data/memo.db file not exist"); 23 | throw "/data/memo.db file not exist"; 24 | } 25 | 26 | return temp; 27 | } 28 | 29 | let db = getDbInstance(); 30 | 31 | function parseResult(result: any): BasicType { 32 | if (result instanceof Array) { 33 | const parsedResult = []; 34 | 35 | for (const data of result) { 36 | parsedResult.push(parseResult(data)); 37 | } 38 | 39 | return parsedResult; 40 | } else if (result instanceof Object) { 41 | const keys = Object.keys(result).map((k) => utils.snakeToCamelCase(k)); 42 | const vals = Object.values(result); 43 | const d: IterObject = {}; 44 | 45 | for (let i = 0; i < keys.length; ++i) { 46 | d[keys[i]] = vals[i]; 47 | } 48 | 49 | return d; 50 | } else { 51 | return null; 52 | } 53 | } 54 | 55 | export default { 56 | run: (sql: string, parms: any[]): Promise => { 57 | if (!db) { 58 | db = getDbInstance(); 59 | } 60 | return new Promise((resolve, reject) => { 61 | db.serialize(() => { 62 | db.run(sql, parms, (err) => { 63 | if (err) { 64 | reject(err); 65 | } else { 66 | resolve(true); 67 | } 68 | }); 69 | }); 70 | }); 71 | }, 72 | all: (sql: string, parms: any[]): Promise => { 73 | if (!db) { 74 | db = getDbInstance(); 75 | } 76 | return new Promise((resolve, reject) => { 77 | db.serialize(() => { 78 | db.all(sql, parms, (err, rows) => { 79 | if (err) { 80 | reject(err); 81 | } else { 82 | resolve(parseResult(rows) as T); 83 | } 84 | }); 85 | }); 86 | }); 87 | }, 88 | get: (sql: string, parms: any[]): Promise => { 89 | if (!db) { 90 | db = getDbInstance(); 91 | } 92 | return new Promise((resolve, reject) => { 93 | db.serialize(() => { 94 | db.get(sql, parms, (err, row) => { 95 | if (err) { 96 | reject(err); 97 | } else { 98 | resolve(parseResult(row) as T | null); 99 | } 100 | }); 101 | }); 102 | }); 103 | }, 104 | }; 105 | -------------------------------------------------------------------------------- /helpers/Error.ts: -------------------------------------------------------------------------------- 1 | const Errors: IterObject = { 2 | "20001": "请先登录", 3 | "20002": "用户名不可用", 4 | "20003": "注册失败,请稍候再试", 5 | "20004": "登录失败,请检查账号密码是否正确", 6 | "20010": "GitHub 服务错误", 7 | "20011": "GitHub 已被绑定", 8 | 9 | // 客户端请求数据格式错误 10 | "30001": "请求数据错误", 11 | 12 | "40001": "未知领域的错误", 13 | 14 | // 服务端出错 15 | "50001": "服务器出错啦,请稍候再试", 16 | "50002": "数据库挂啦,请稍候再试", 17 | }; 18 | const ErrorCode = Object.keys(Errors); 19 | 20 | export function getErrorInfo(code: string) { 21 | if (!ErrorCode.includes(code)) { 22 | code = "40001"; 23 | } 24 | const statusCode = parseInt(code.slice(0, 3)); 25 | 26 | return { 27 | statusCode, 28 | message: Errors[code], 29 | }; 30 | } 31 | -------------------------------------------------------------------------------- /helpers/config.ts: -------------------------------------------------------------------------------- 1 | export const githubOAuthConfig = { 2 | clientId: process.env.GH_CLIENT_ID || "187ba36888f152b06612", 3 | clientSecret: process.env.GH_CLIENT_SECRET || "10b6fec4146cbb7bdf64016b3cf0905366a35041", 4 | redirectUri: process.env.GH_REDIRECT_URI || "https://memos.justsven.top/", 5 | }; 6 | -------------------------------------------------------------------------------- /helpers/utils.ts: -------------------------------------------------------------------------------- 1 | import crypto from "crypto"; 2 | import { generate } from "short-uuid"; 3 | 4 | namespace utils { 5 | /** 6 | * generate uuid 7 | * @returns uuid 8 | */ 9 | export function genUUID(): string { 10 | return generate(); 11 | } 12 | 13 | export function getNowTimeStamp(): TimeStamp { 14 | return Date.now(); 15 | } 16 | 17 | export function getTimeStampByDate(t: Date | number | string): number { 18 | if (typeof t === "string") { 19 | t = t.replaceAll("-", "/"); 20 | } 21 | const d = new Date(t); 22 | 23 | return d.getTime(); 24 | } 25 | 26 | export function getDateStampByDate(t: Date | number | string): number { 27 | const d = new Date(getTimeStampByDate(t)); 28 | 29 | return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime(); 30 | } 31 | 32 | export function getDateString(t: Date | number | string): string { 33 | const d = new Date(getTimeStampByDate(t)); 34 | 35 | const year = d.getFullYear(); 36 | const month = d.getMonth() + 1; 37 | const date = d.getDate(); 38 | 39 | return `${year}/${month}/${date}`; 40 | } 41 | 42 | export function getTimeString(t: Date | number | string): string { 43 | const d = new Date(getTimeStampByDate(t)); 44 | 45 | const hours = d.getHours(); 46 | const mins = d.getMinutes(); 47 | 48 | const hoursStr = hours < 10 ? "0" + hours : hours; 49 | const minsStr = mins < 10 ? "0" + mins : mins; 50 | 51 | return `${hoursStr}:${minsStr}`; 52 | } 53 | 54 | // For example: 2021-4-8 17:52:17 55 | export function getDateTimeString(t: Date | number | string): string { 56 | const d = new Date(getTimeStampByDate(t)); 57 | 58 | const year = d.getFullYear(); 59 | const month = d.getMonth() + 1; 60 | const date = d.getDate(); 61 | const hours = d.getHours(); 62 | const mins = d.getMinutes(); 63 | const secs = d.getSeconds(); 64 | 65 | const monthStr = month < 10 ? "0" + month : month; 66 | const dateStr = date < 10 ? "0" + date : date; 67 | const hoursStr = hours < 10 ? "0" + hours : hours; 68 | const minsStr = mins < 10 ? "0" + mins : mins; 69 | const secsStr = secs < 10 ? "0" + secs : secs; 70 | 71 | return `${year}/${monthStr}/${dateStr} ${hoursStr}:${minsStr}:${secsStr}`; 72 | } 73 | 74 | export function isString(s: any): boolean { 75 | return typeof s === "string"; 76 | } 77 | 78 | export function snakeToCamelCase(s: string): string { 79 | const keys = s.split("_").map((k) => toFirstUpperCase(k)); 80 | 81 | return toFirstLowerCase(keys.join("")); 82 | } 83 | 84 | export function toFirstUpperCase(s: string): string { 85 | return s.replace(/^[a-z]/g, (c) => c.toUpperCase()); 86 | } 87 | 88 | export function toFirstLowerCase(s: string): string { 89 | return s.replace(/^[A-Z]/g, (c) => c.toLowerCase()); 90 | } 91 | 92 | export function getInsecureSHA1ofStr(str: string) { 93 | return crypto.createHash("sha1").update(str).digest("hex"); 94 | } 95 | } 96 | 97 | export default utils; 98 | -------------------------------------------------------------------------------- /middlewares/authCheck.ts: -------------------------------------------------------------------------------- 1 | import { Context, Next } from "koa"; 2 | 3 | export async function validSigninCookie(ctx: Context, next: Next) { 4 | const userId = ctx.session?.userId ?? ""; 5 | 6 | if (!Boolean(userId)) { 7 | throw new Error("20001"); 8 | } 9 | 10 | await next(); 11 | } 12 | -------------------------------------------------------------------------------- /middlewares/errorHandler.ts: -------------------------------------------------------------------------------- 1 | import { Context, Next } from "koa"; 2 | import { getErrorInfo } from "../helpers/Error"; 3 | 4 | export async function errorHandler(ctx: Context, next: Next) { 5 | try { 6 | await next(); 7 | } catch (error: any) { 8 | const errorInfo = getErrorInfo(error.message); 9 | 10 | ctx.status = errorInfo.statusCode; 11 | ctx.body = { 12 | succeed: false, 13 | status: errorInfo.statusCode ?? 500, 14 | message: `${errorInfo.message}`, 15 | data: null, 16 | }; 17 | console.error("Error handler:", error.message, errorInfo); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /models/MemoModel.ts: -------------------------------------------------------------------------------- 1 | import DB from "../helpers/DBHelper"; 2 | import utils from "../helpers/utils"; 3 | 4 | interface MemoType { 5 | id: string; 6 | content: string; 7 | userId: string; 8 | createdAt: string; 9 | updatedAt: string; 10 | deletedAt?: string; 11 | } 12 | 13 | export namespace MemoModel { 14 | export async function createMemo(userId: string, content: string): Promise { 15 | const sql = `INSERT INTO memos (id, content, user_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?)`; 16 | const nowTimeStr = utils.getDateTimeString(Date.now()); 17 | const memo: MemoType = { 18 | id: utils.genUUID(), 19 | content, 20 | userId, 21 | createdAt: nowTimeStr, 22 | updatedAt: nowTimeStr, 23 | }; 24 | 25 | await DB.run(sql, Object.values(memo)); 26 | return memo; 27 | } 28 | 29 | export async function countMemosByUserId(userId: string): Promise { 30 | const sql = `SELECT COUNT(*) as count FROM memos WHERE user_id=?`; 31 | 32 | const data = await DB.get(sql, [userId]); 33 | if (data === null) { 34 | return 0; 35 | } else { 36 | return data.count as number; 37 | } 38 | } 39 | 40 | export async function getAllMemosByUserId(userId: string): Promise { 41 | const sql = `SELECT id, content, created_at, updated_at, deleted_at FROM memos WHERE user_id=? AND deleted_at IS NULL ORDER BY created_at DESC`; 42 | 43 | const data = await DB.all(sql, [userId]); 44 | return data; 45 | } 46 | 47 | export async function getMemosByUserId(userId: string, offset: number, amount: number = 20): Promise { 48 | const sql = `SELECT * FROM memos WHERE user_id=? AND deleted_at IS NULL ORDER BY created_at DESC LIMIT ${amount} OFFSET ${offset}`; 49 | 50 | const data = await DB.all(sql, [userId]); 51 | return data; 52 | } 53 | 54 | export async function getDeletedMemosByUserId(userId: string): Promise { 55 | const sql = `SELECT * FROM memos WHERE user_id=? AND deleted_at IS NOT NULL ORDER BY deleted_at DESC`; 56 | 57 | const data = await DB.all(sql, [userId]); 58 | return data; 59 | } 60 | 61 | export async function getMemosWithDuration(userId: string, from: Date, to: Date): Promise { 62 | const sql = ` 63 | SELECT * FROM memos 64 | WHERE 65 | user_id=? 66 | ${Boolean(from) ? "AND created_at > '" + utils.getDateTimeString(from) + "'" : ""} 67 | ${Boolean(to) ? "AND created_at < '" + utils.getDateTimeString(to) + "'" : ""} 68 | ORDER BY created_at 69 | DESC 70 | `; 71 | 72 | const data = await DB.all(sql, [userId]); 73 | return data; 74 | } 75 | 76 | export async function getMemoById(id: string): Promise { 77 | const sql = `SELECT * FROM memos WHERE id=?`; 78 | 79 | const data = await DB.get(sql, [id]); 80 | return data; 81 | } 82 | 83 | export async function getLinkedMemosById(userId: string, memoId: string): Promise { 84 | const sql = `SELECT * FROM memos WHERE user_id=? AND content LIKE '%[@%](${memoId})%'`; 85 | const data = await DB.all(sql, [userId]); 86 | return data; 87 | } 88 | 89 | export async function updateMemoContent(memoId: string, content: string): Promise { 90 | const sql = `UPDATE memos SET content=?, updated_at=? WHERE id=?`; 91 | const nowTimeStr = utils.getDateTimeString(Date.now()); 92 | 93 | await DB.run(sql, [content, nowTimeStr, memoId]); 94 | return true; 95 | } 96 | 97 | export async function deleteMemoByID(memoId: string): Promise { 98 | const sql = `DELETE FROM memos WHERE id=?`; 99 | 100 | await DB.run(sql, [memoId]); 101 | return true; 102 | } 103 | 104 | export async function updateMemoDeletedAt(memoId: string, deletedAtStr: string | null): Promise { 105 | const sql = `UPDATE memos SET deleted_at=? WHERE id=?`; 106 | 107 | const data = await DB.all(sql, [deletedAtStr, memoId]); 108 | return data; 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /models/QueryModel.ts: -------------------------------------------------------------------------------- 1 | import DB from "../helpers/DBHelper"; 2 | import utils from "../helpers/utils"; 3 | 4 | interface QueryType { 5 | id: string; 6 | userId: string; 7 | title: string; 8 | querystring: string; 9 | createdAt: string; 10 | updatedAt: string; 11 | pinnedAt?: string; 12 | } 13 | 14 | export namespace QueryModel { 15 | /** 16 | * create query 17 | * @param userId 18 | * @param text 19 | */ 20 | export async function createQuery(userId: string, title: string, querystring: string): Promise { 21 | const nowTimeStr = utils.getDateTimeString(Date.now()); 22 | const query: QueryType = { 23 | id: utils.genUUID(), 24 | userId, 25 | title, 26 | querystring, 27 | createdAt: nowTimeStr, 28 | updatedAt: nowTimeStr, 29 | }; 30 | const sql = `INSERT INTO queries (id, user_id, title, querystring, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)`; 31 | 32 | await DB.run(sql, Object.values(query)); 33 | return query; 34 | } 35 | 36 | export async function pinQuery(queryId: string): Promise { 37 | const nowTimeStr = utils.getDateTimeString(Date.now()); 38 | const sql = `UPDATE queries SET pinned_at=? WHERE id=?`; 39 | 40 | await DB.run(sql, [nowTimeStr, queryId]); 41 | return true; 42 | } 43 | 44 | export async function unpinQuery(queryId: string): Promise { 45 | const sql = `UPDATE queries SET pinned_at=NULL WHERE id=?`; 46 | 47 | await DB.run(sql, [queryId]); 48 | return true; 49 | } 50 | 51 | export async function getQueriesByUserId(userId: string): Promise { 52 | const sql = `SELECT id, title, querystring, created_at, pinned_at FROM queries WHERE user_id=?`; 53 | 54 | const data = await DB.all(sql, [userId]); 55 | return data; 56 | } 57 | 58 | export async function getQueryById(id: string): Promise { 59 | const sql = `SELECT * FROM queries WHERE id=?`; 60 | 61 | const data = await DB.get(sql, [id]); 62 | return data; 63 | } 64 | 65 | export async function getQueryByText(userId: string, text: string): Promise { 66 | const sql = `SELECT * FROM queries WHERE user_id=? AND querystring=?`; 67 | 68 | const data = await DB.get(sql, [userId, text]); 69 | return data; 70 | } 71 | 72 | export async function updateQuery(id: string, title: string, querystring: string): Promise { 73 | const nowTimeStr = utils.getDateTimeString(Date.now()); 74 | const sql = `UPDATE queries SET title=?, querystring=?, updated_at=? WHERE id=?`; 75 | 76 | await DB.run(sql, [title, querystring, nowTimeStr, id]); 77 | return true; 78 | } 79 | 80 | export async function deleteQueryById(queryId: string): Promise { 81 | const sql = `DELETE FROM queries WHERE id=?`; 82 | 83 | await DB.run(sql, [queryId]); 84 | return true; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /models/UserModel.ts: -------------------------------------------------------------------------------- 1 | import DB from "../helpers/DBHelper"; 2 | import utils from "../helpers/utils"; 3 | 4 | interface UserType { 5 | id: string; 6 | username: string; 7 | password: string; 8 | createdAt: string; 9 | updatedAt: string; 10 | githubName: string; 11 | wxUserId: string; 12 | } 13 | 14 | export namespace UserModel { 15 | export async function createUser(username: string, password: string, githubName = "", wxUserId = ""): Promise { 16 | const nowTimeStr = utils.getDateTimeString(Date.now()); 17 | const user: UserType = { 18 | id: utils.genUUID(), 19 | username, 20 | password, 21 | createdAt: nowTimeStr, 22 | updatedAt: nowTimeStr, 23 | githubName, 24 | wxUserId, 25 | }; 26 | const sql = "INSERT INTO users (id, username, password, created_at, updated_at, github_name, wx_user_id) VALUES (?, ?, ?, ?, ?, ?)"; 27 | await DB.run(sql, Object.values(user)); 28 | return user; 29 | } 30 | 31 | export async function updateUser( 32 | id: string, 33 | username?: string, 34 | password?: string, 35 | githubName?: string, 36 | wxUserId?: string 37 | ): Promise { 38 | const nowTimeStr = utils.getDateTimeString(Date.now()); 39 | const sql = `UPDATE users SET ${username !== undefined ? "username='" + username + "' ," : ""} ${ 40 | password !== undefined ? "password='" + password + "' ," : "" 41 | } ${githubName !== undefined ? "github_name='" + githubName + "' ," : ""} ${ 42 | wxUserId !== undefined ? "wx_user_id='" + wxUserId + "' ," : "" 43 | } updated_at='${nowTimeStr}' WHERE id=?`; 44 | await DB.run(sql, [id]); 45 | return true; 46 | } 47 | 48 | export async function getUserInfoById(userId: string): Promise { 49 | const sql = "SELECT * FROM users WHERE id=?"; 50 | const data = await DB.get(sql, [userId]); 51 | return data; 52 | } 53 | 54 | export async function checkUsernameUsable(username: string): Promise { 55 | const sql = "SELECT * FROM users WHERE username=?"; 56 | const data = await DB.get(sql, [username]); 57 | if (data === null) { 58 | return true; 59 | } else { 60 | return false; 61 | } 62 | } 63 | 64 | export async function checkGithubnameUsable(githubName: string): Promise { 65 | const sql = "SELECT * FROM users WHERE github_name=?"; 66 | const data = await DB.get(sql, [githubName]); 67 | if (data === null) { 68 | return true; 69 | } else { 70 | return false; 71 | } 72 | } 73 | 74 | export async function validSigninInfo(username: string, password: string): Promise { 75 | const sql = "SELECT * FROM users WHERE username=? AND password=?"; 76 | const data = await DB.get(sql, [username, password]); 77 | return data; 78 | } 79 | 80 | export async function validPassword(userId: string, password: string): Promise { 81 | const sql = "SELECT * FROM users WHERE id=? AND password=?"; 82 | const data = await DB.get(sql, [userId, password]); 83 | if (data === null) { 84 | return false; 85 | } else { 86 | return true; 87 | } 88 | } 89 | 90 | export async function getUserByGhName(gbName: string): Promise { 91 | const sql = "SELECT * FROM users WHERE github_name=?"; 92 | const data = await DB.get(sql, [gbName]); 93 | return data; 94 | } 95 | 96 | export async function getUserByWxUserId(wxUserId: string): Promise { 97 | const sql = "SELECT * FROM users WHERE wx_user_id=?"; 98 | const data = await DB.get(sql, [wxUserId]); 99 | return data; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "memos-backend", 3 | "version": "1.0.0", 4 | "author": "boojack ", 5 | "license": "", 6 | "scripts": { 7 | "dev": "nodemon --watch '**/*.ts' --exec cross-env NODE_ENV=dev ts-node --files ./server.ts", 8 | "build": "tsc --project ./" 9 | }, 10 | "dependencies": { 11 | "axios": "^0.21.1", 12 | "koa": "^2.13.1", 13 | "koa-bodyparser": "^4.3.0", 14 | "koa-mount": "^4.0.0", 15 | "koa-router": "^10.0.0", 16 | "koa-session": "^6.2.0", 17 | "koa-static": "^5.0.0", 18 | "koa2-connect-history-api-fallback": "^0.1.3", 19 | "query-string": "^7.0.1", 20 | "short-uuid": "^4.2.0", 21 | "sqlite3": "^5.0.2", 22 | "xml2js": "^0.4.23" 23 | }, 24 | "devDependencies": { 25 | "@types/koa": "^2.13.1", 26 | "@types/koa-bodyparser": "^4.3.0", 27 | "@types/koa-mount": "^4.0.0", 28 | "@types/koa-router": "^7.4.1", 29 | "@types/koa-session": "^5.10.4", 30 | "@types/koa-static": "^4.0.1", 31 | "@types/sqlite3": "^3.1.7", 32 | "@types/xml2js": "^0.4.9", 33 | "cross-env": "^7.0.3", 34 | "nodemon": "^2.0.7", 35 | "ts-node": "^9.1.1", 36 | "typescript": "^4.2.3" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /resources/memos.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boojack/insmemo/b523c480b4cc63965a2f278b3a4dfbe4199a701e/resources/memos.db -------------------------------------------------------------------------------- /resources/sqlite.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `users` ( 2 | `id` TEXT NOT NULL PRIMARY KEY, 3 | `username` TEXT NOT NULL, 4 | `password` TEXT NOT NULL, 5 | `github_name` TEXT NULL DEFAULT '', 6 | `wx_user_id` TEXT NULL DEFAULT '', 7 | `created_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, 8 | `updated_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP 9 | ); 10 | 11 | CREATE TABLE `memos` ( 12 | `id` TEXT NOT NULL PRIMARY KEY, 13 | `content` TEXT NOT NULL, 14 | `user_id` TEXT NOT NULL, 15 | `created_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, 16 | `updated_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, 17 | `deleted_at` TEXT, 18 | FOREIGN KEY(`user_id`) REFERENCES `users`(`id`) 19 | ); 20 | 21 | CREATE TABLE `queries` ( 22 | `id` TEXT NOT NULL PRIMARY KEY, 23 | `user_id` TEXT NOT NULL, 24 | `title` TEXT NOT NULL, 25 | `querystring` TEXT NOT NULL, 26 | `created_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, 27 | `updated_at` TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, 28 | `pinned_at` TEXT NULL, 29 | FOREIGN KEY(`user_id`) REFERENCES `users`(`id`) 30 | ); 31 | -------------------------------------------------------------------------------- /roadmap.md: -------------------------------------------------------------------------------- 1 | # Memos roadmap 2 | 3 | ## 总体思路 4 | 5 | - 先保证可用性; 6 | - 再去完善逻辑、扩展; 7 | -------------------------------------------------------------------------------- /routers/github.ts: -------------------------------------------------------------------------------- 1 | import Router from "koa-router"; 2 | import { GithubController } from "../controllers/github"; 3 | 4 | export const githubRouter = new Router({ 5 | prefix: "/api/gh", 6 | }); 7 | 8 | githubRouter.get("/oauth", GithubController.oauth); 9 | -------------------------------------------------------------------------------- /routers/memo.ts: -------------------------------------------------------------------------------- 1 | import Router from "koa-router"; 2 | import { MemoController } from "../controllers/memo"; 3 | import { validSigninCookie } from "../middlewares/authCheck"; 4 | 5 | export const memoRouter = new Router({ 6 | prefix: "/api/memo", 7 | }); 8 | 9 | memoRouter.use(validSigninCookie); 10 | memoRouter.get("/", MemoController.getMemoById); 11 | memoRouter.get("/all", MemoController.getAllMemos); 12 | memoRouter.get("/linked", MemoController.getLinkedMemosById); 13 | memoRouter.get("/deleted", MemoController.getDeletedMemos); 14 | memoRouter.post("/new", MemoController.createMemo); 15 | memoRouter.post("/hide", MemoController.hideMemo); 16 | memoRouter.post("/restore", MemoController.restoreMemo); 17 | memoRouter.post("/delete", MemoController.deleteMemo); 18 | memoRouter.post("/update", MemoController.updateMemo); 19 | -------------------------------------------------------------------------------- /routers/query.ts: -------------------------------------------------------------------------------- 1 | import Router from "koa-router"; 2 | import { QueryController } from "../controllers/query"; 3 | import { validSigninCookie } from "../middlewares/authCheck"; 4 | 5 | export const queryRouter = new Router({ 6 | prefix: "/api/query", 7 | }); 8 | 9 | queryRouter.use(validSigninCookie); 10 | queryRouter.get("/all", QueryController.getMyQueries); 11 | queryRouter.post("/new", QueryController.createQuery); 12 | queryRouter.post("/update", QueryController.updateQuery); 13 | queryRouter.post("/delete", QueryController.deleteQueryById); 14 | queryRouter.post("/pin", QueryController.pinQuery); 15 | queryRouter.post("/unpin", QueryController.unpinQuery); 16 | -------------------------------------------------------------------------------- /routers/user.ts: -------------------------------------------------------------------------------- 1 | import Router from "koa-router"; 2 | import { UserController } from "../controllers/user"; 3 | import { validSigninCookie } from "../middlewares/authCheck"; 4 | 5 | export const userRouter = new Router({ 6 | prefix: "/api/user", 7 | }); 8 | 9 | userRouter.get("/me", validSigninCookie, UserController.getMyUserInfo); 10 | userRouter.post("/signup", UserController.signup); 11 | userRouter.post("/signin", UserController.signin); 12 | userRouter.post("/signout", UserController.signout); 13 | userRouter.get("/checkusername", validSigninCookie, UserController.checkUsernameUsable); 14 | userRouter.post("/update", validSigninCookie, UserController.update); 15 | userRouter.post("/checkpassword", validSigninCookie, UserController.checkPassword); 16 | -------------------------------------------------------------------------------- /routers/wx.ts: -------------------------------------------------------------------------------- 1 | import Router from "koa-router"; 2 | import { WxController } from "../controllers/wx"; 3 | 4 | export const wxRouter = new Router({ 5 | prefix: "/api/wx", 6 | }); 7 | 8 | wxRouter.get("/", WxController.validate); 9 | wxRouter.post("/", WxController.handleWxMessage); 10 | -------------------------------------------------------------------------------- /scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -x 2 | cd `dirname $0` 3 | 4 | tag="latest" 5 | 6 | if [[ ! -z "$1" ]] 7 | then 8 | tag=$1 9 | fi 10 | 11 | docker build -t memos:$tag ../ 12 | docker tag memos:$tag neosmemo/memos:$tag 13 | docker push neosmemo/memos:$tag 14 | -------------------------------------------------------------------------------- /server.ts: -------------------------------------------------------------------------------- 1 | import Koa from "koa"; 2 | import bodyParser from "koa-bodyparser"; 3 | import Mount from "koa-mount"; 4 | import Serve from "koa-static"; 5 | import session from "koa-session"; 6 | import historyApiFallback from "koa2-connect-history-api-fallback"; 7 | import { errorHandler } from "./middlewares/errorHandler"; 8 | import { userRouter } from "./routers/user"; 9 | import { memoRouter } from "./routers/memo"; 10 | import { queryRouter } from "./routers/query"; 11 | import { githubRouter } from "./routers/github"; 12 | import { wxRouter } from "./routers/wx"; 13 | 14 | const app = new Koa(); 15 | 16 | const CONFIG: Partial = { 17 | key: "session", 18 | maxAge: 1000 * 3600 * 24 * 365, 19 | overwrite: true, 20 | httpOnly: true, 21 | signed: true, 22 | rolling: false, 23 | renew: false, 24 | secure: false, 25 | sameSite: "strict", 26 | }; 27 | 28 | app.keys = ["justsven.site"]; 29 | 30 | app.use(session(CONFIG, app)); 31 | 32 | app.use(errorHandler); 33 | 34 | app.use( 35 | Mount( 36 | "/", 37 | Serve("./web/", { 38 | maxAge: 1000 * 60 * 60 * 24 * 30, 39 | defer: true, 40 | }) 41 | ) 42 | ); 43 | 44 | app.use(historyApiFallback({ whiteList: ["/api"] })); 45 | 46 | app.use( 47 | bodyParser({ 48 | enableTypes: ["json", "form", "text", "xml"], 49 | }) 50 | ); 51 | 52 | app.use(userRouter.routes()); 53 | app.use(memoRouter.routes()); 54 | app.use(queryRouter.routes()); 55 | app.use(githubRouter.routes()); 56 | app.use(wxRouter.routes()); 57 | 58 | app.listen(8080, () => { 59 | console.log("server started in :8080"); 60 | }); 61 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 8 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 9 | "lib": ["es2021"] /* Specify library files to be included in the compilation. */, 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "./build" /* Redirect output structure to the directory. */, 18 | "rootDir": "./" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true /* Enable all strict type-checking options. */, 29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 43 | 44 | /* Module Resolution Options */ 45 | "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, 46 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 47 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 48 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 49 | "typeRoots": ["./typings"] /* List of folders to include type definitions from. */, 50 | // "types": [], /* Type declaration files to be included in compilation. */ 51 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 52 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 53 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 54 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 55 | 56 | /* Source Map Options */ 57 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 58 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 59 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 60 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 61 | 62 | /* Experimental Options */ 63 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 64 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 65 | 66 | /* Advanced Options */ 67 | "skipLibCheck": true /* Skip type checking of declaration files. */, 68 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 69 | }, 70 | "exclude": ["web"] 71 | } 72 | -------------------------------------------------------------------------------- /typings/basic.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * type and interface definations 3 | */ 4 | type BasicType = undefined | null | boolean | number | string | Object | Array; 5 | type TimeStamp = number; 6 | type FunctionType = (...args: any) => any; 7 | 8 | interface IterObject { 9 | [key: string]: any; 10 | } 11 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sindresorhus/is@^0.14.0": 6 | version "0.14.0" 7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 8 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 9 | 10 | "@szmarczak/http-timer@^1.1.2": 11 | version "1.1.2" 12 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 13 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 14 | dependencies: 15 | defer-to-connect "^1.0.1" 16 | 17 | "@types/accepts@*": 18 | version "1.3.5" 19 | resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" 20 | integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== 21 | dependencies: 22 | "@types/node" "*" 23 | 24 | "@types/body-parser@*": 25 | version "1.19.2" 26 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" 27 | integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== 28 | dependencies: 29 | "@types/connect" "*" 30 | "@types/node" "*" 31 | 32 | "@types/connect@*": 33 | version "3.4.35" 34 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 35 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 36 | dependencies: 37 | "@types/node" "*" 38 | 39 | "@types/content-disposition@*": 40 | version "0.5.4" 41 | resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" 42 | integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== 43 | 44 | "@types/cookies@*": 45 | version "0.7.7" 46 | resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" 47 | integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== 48 | dependencies: 49 | "@types/connect" "*" 50 | "@types/express" "*" 51 | "@types/keygrip" "*" 52 | "@types/node" "*" 53 | 54 | "@types/express-serve-static-core@^4.17.18": 55 | version "4.17.25" 56 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz#e42f7046adc65ece2eb6059b77aecfbe9e9f82e0" 57 | integrity sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ== 58 | dependencies: 59 | "@types/node" "*" 60 | "@types/qs" "*" 61 | "@types/range-parser" "*" 62 | 63 | "@types/express@*": 64 | version "4.17.13" 65 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" 66 | integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== 67 | dependencies: 68 | "@types/body-parser" "*" 69 | "@types/express-serve-static-core" "^4.17.18" 70 | "@types/qs" "*" 71 | "@types/serve-static" "*" 72 | 73 | "@types/http-assert@*": 74 | version "1.5.3" 75 | resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" 76 | integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== 77 | 78 | "@types/http-errors@*": 79 | version "1.8.1" 80 | resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.1.tgz#e81ad28a60bee0328c6d2384e029aec626f1ae67" 81 | integrity sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q== 82 | 83 | "@types/keygrip@*": 84 | version "1.0.2" 85 | resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" 86 | integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== 87 | 88 | "@types/koa-bodyparser@^4.3.0": 89 | version "4.3.4" 90 | resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.3.4.tgz#86aca8ba2ac5896f84386f52cf02eb06563e2539" 91 | integrity sha512-eNyHGkIxwJKYaZhyxzAVP3taZVWNgAw+Gzl1Zc9vdkfzoBjypTANLwOAb6tC2hGOXS5uw4O08N6jaL6MdrltqQ== 92 | dependencies: 93 | "@types/koa" "*" 94 | 95 | "@types/koa-compose@*": 96 | version "3.2.5" 97 | resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" 98 | integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== 99 | dependencies: 100 | "@types/koa" "*" 101 | 102 | "@types/koa-mount@^4.0.0": 103 | version "4.0.1" 104 | resolved "https://registry.yarnpkg.com/@types/koa-mount/-/koa-mount-4.0.1.tgz#2994be86eaa3d9dc97365e6ebfa227cee3c5f157" 105 | integrity sha512-HNeg80CVS9Dfq8dGYqCZZCAUm7g6jPCNJ1ydqVLEJxLrjmeburpvq+lOZkE4rxBZ6O38dr3tj9IA3IfbdoI05w== 106 | dependencies: 107 | "@types/koa" "*" 108 | 109 | "@types/koa-router@^7.4.1": 110 | version "7.4.4" 111 | resolved "https://registry.yarnpkg.com/@types/koa-router/-/koa-router-7.4.4.tgz#db72bde3616365d74f00178d5f243c4fce7da572" 112 | integrity sha512-3dHlZ6CkhgcWeF6wafEUvyyqjWYfKmev3vy1PtOmr0mBc3wpXPU5E8fBBd4YQo5bRpHPfmwC5yDaX7s4jhIN6A== 113 | dependencies: 114 | "@types/koa" "*" 115 | 116 | "@types/koa-send@*": 117 | version "4.1.3" 118 | resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.3.tgz#17193c6472ae9e5d1b99ae8086949cc4fd69179d" 119 | integrity sha512-daaTqPZlgjIJycSTNjKpHYuKhXYP30atFc1pBcy6HHqB9+vcymDgYTguPdx9tO4HMOqNyz6bz/zqpxt5eLR+VA== 120 | dependencies: 121 | "@types/koa" "*" 122 | 123 | "@types/koa-session@^5.10.4": 124 | version "5.10.4" 125 | resolved "https://registry.npmmirror.com/@types/koa-session/download/@types/koa-session-5.10.4.tgz#d5f97532f6ef27d5c4e1b04c3fd3ff447693bf10" 126 | integrity sha1-1fl1MvbvJ9XE4bBMP9P/RHaTvxA= 127 | dependencies: 128 | "@types/cookies" "*" 129 | "@types/koa" "*" 130 | 131 | "@types/koa-static@^4.0.1": 132 | version "4.0.2" 133 | resolved "https://registry.yarnpkg.com/@types/koa-static/-/koa-static-4.0.2.tgz#a199d2d64d2930755eb3ea370aeaf2cb6f501d67" 134 | integrity sha512-ns/zHg+K6XVPMuohjpOlpkR1WLa4VJ9czgUP9bxkCDn0JZBtUWbD/wKDZzPGDclkQK1bpAEScufCHOy8cbfL0w== 135 | dependencies: 136 | "@types/koa" "*" 137 | "@types/koa-send" "*" 138 | 139 | "@types/koa@*", "@types/koa@^2.13.1": 140 | version "2.13.4" 141 | resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" 142 | integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== 143 | dependencies: 144 | "@types/accepts" "*" 145 | "@types/content-disposition" "*" 146 | "@types/cookies" "*" 147 | "@types/http-assert" "*" 148 | "@types/http-errors" "*" 149 | "@types/keygrip" "*" 150 | "@types/koa-compose" "*" 151 | "@types/node" "*" 152 | 153 | "@types/mime@^1": 154 | version "1.3.2" 155 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" 156 | integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== 157 | 158 | "@types/node@*": 159 | version "16.11.9" 160 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.9.tgz#879be3ad7af29f4c1a5c433421bf99fab7047185" 161 | integrity sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A== 162 | 163 | "@types/qs@*": 164 | version "6.9.7" 165 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 166 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 167 | 168 | "@types/range-parser@*": 169 | version "1.2.4" 170 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 171 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 172 | 173 | "@types/serve-static@*": 174 | version "1.13.10" 175 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" 176 | integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== 177 | dependencies: 178 | "@types/mime" "^1" 179 | "@types/node" "*" 180 | 181 | "@types/sqlite3@^3.1.7": 182 | version "3.1.7" 183 | resolved "https://registry.yarnpkg.com/@types/sqlite3/-/sqlite3-3.1.7.tgz#84fbc65946603d15cff4968d0cb283d1879dd156" 184 | integrity sha512-8FHV/8Uzd7IwdHm5mvmF2Aif4aC/gjrt4axWD9SmfaxITnOjtOhCbOSTuqv/VbH1uq0QrwlaTj9aTz3gmR6u4w== 185 | dependencies: 186 | "@types/node" "*" 187 | 188 | "@types/xml2js@^0.4.9": 189 | version "0.4.9" 190 | resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.9.tgz#a38267d8c2fe121c96922b12ee3bd89a58a6e20e" 191 | integrity sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw== 192 | dependencies: 193 | "@types/node" "*" 194 | 195 | abbrev@1: 196 | version "1.1.1" 197 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 198 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 199 | 200 | accepts@^1.3.5: 201 | version "1.3.7" 202 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 203 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 204 | dependencies: 205 | mime-types "~2.1.24" 206 | negotiator "0.6.2" 207 | 208 | ajv@^6.12.3: 209 | version "6.12.6" 210 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 211 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 212 | dependencies: 213 | fast-deep-equal "^3.1.1" 214 | fast-json-stable-stringify "^2.0.0" 215 | json-schema-traverse "^0.4.1" 216 | uri-js "^4.2.2" 217 | 218 | ansi-align@^3.0.0: 219 | version "3.0.1" 220 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" 221 | integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== 222 | dependencies: 223 | string-width "^4.1.0" 224 | 225 | ansi-regex@^2.0.0: 226 | version "2.1.1" 227 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 228 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 229 | 230 | ansi-regex@^5.0.1: 231 | version "5.0.1" 232 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 233 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 234 | 235 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 236 | version "4.3.0" 237 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 238 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 239 | dependencies: 240 | color-convert "^2.0.1" 241 | 242 | any-base@^1.1.0: 243 | version "1.1.0" 244 | resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" 245 | integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== 246 | 247 | anymatch@~3.1.2: 248 | version "3.1.2" 249 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 250 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 251 | dependencies: 252 | normalize-path "^3.0.0" 253 | picomatch "^2.0.4" 254 | 255 | aproba@^1.0.3: 256 | version "1.2.0" 257 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 258 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 259 | 260 | are-we-there-yet@~1.1.2: 261 | version "1.1.7" 262 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" 263 | integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== 264 | dependencies: 265 | delegates "^1.0.0" 266 | readable-stream "^2.0.6" 267 | 268 | arg@^4.1.0: 269 | version "4.1.3" 270 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 271 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 272 | 273 | asn1@~0.2.3: 274 | version "0.2.6" 275 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" 276 | integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== 277 | dependencies: 278 | safer-buffer "~2.1.0" 279 | 280 | assert-plus@1.0.0, assert-plus@^1.0.0: 281 | version "1.0.0" 282 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 283 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 284 | 285 | asynckit@^0.4.0: 286 | version "0.4.0" 287 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 288 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 289 | 290 | aws-sign2@~0.7.0: 291 | version "0.7.0" 292 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 293 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 294 | 295 | aws4@^1.8.0: 296 | version "1.11.0" 297 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" 298 | integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== 299 | 300 | axios@^0.21.1: 301 | version "0.21.4" 302 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" 303 | integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== 304 | dependencies: 305 | follow-redirects "^1.14.0" 306 | 307 | balanced-match@^1.0.0: 308 | version "1.0.2" 309 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 310 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 311 | 312 | base64-js@^1.3.1: 313 | version "1.5.1" 314 | resolved "https://registry.npmmirror.com/base64-js/download/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 315 | integrity sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= 316 | 317 | bcrypt-pbkdf@^1.0.0: 318 | version "1.0.2" 319 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 320 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 321 | dependencies: 322 | tweetnacl "^0.14.3" 323 | 324 | binary-extensions@^2.0.0: 325 | version "2.2.0" 326 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 327 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 328 | 329 | block-stream@*: 330 | version "0.0.9" 331 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 332 | integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= 333 | dependencies: 334 | inherits "~2.0.0" 335 | 336 | boxen@^5.0.0: 337 | version "5.1.2" 338 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" 339 | integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== 340 | dependencies: 341 | ansi-align "^3.0.0" 342 | camelcase "^6.2.0" 343 | chalk "^4.1.0" 344 | cli-boxes "^2.2.1" 345 | string-width "^4.2.2" 346 | type-fest "^0.20.2" 347 | widest-line "^3.1.0" 348 | wrap-ansi "^7.0.0" 349 | 350 | brace-expansion@^1.1.7: 351 | version "1.1.11" 352 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 353 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 354 | dependencies: 355 | balanced-match "^1.0.0" 356 | concat-map "0.0.1" 357 | 358 | braces@~3.0.2: 359 | version "3.0.2" 360 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 361 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 362 | dependencies: 363 | fill-range "^7.0.1" 364 | 365 | buffer-from@^1.0.0: 366 | version "1.1.2" 367 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 368 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 369 | 370 | buffer@^5.1.0: 371 | version "5.7.1" 372 | resolved "https://registry.nlark.com/buffer/download/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 373 | integrity sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA= 374 | dependencies: 375 | base64-js "^1.3.1" 376 | ieee754 "^1.1.13" 377 | 378 | bytes@3.1.1: 379 | version "3.1.1" 380 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" 381 | integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== 382 | 383 | cache-content-type@^1.0.0: 384 | version "1.0.1" 385 | resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" 386 | integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== 387 | dependencies: 388 | mime-types "^2.1.18" 389 | ylru "^1.2.0" 390 | 391 | cacheable-request@^6.0.0: 392 | version "6.1.0" 393 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 394 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 395 | dependencies: 396 | clone-response "^1.0.2" 397 | get-stream "^5.1.0" 398 | http-cache-semantics "^4.0.0" 399 | keyv "^3.0.0" 400 | lowercase-keys "^2.0.0" 401 | normalize-url "^4.1.0" 402 | responselike "^1.0.2" 403 | 404 | call-bind@^1.0.0: 405 | version "1.0.2" 406 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 407 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 408 | dependencies: 409 | function-bind "^1.1.1" 410 | get-intrinsic "^1.0.2" 411 | 412 | camelcase@^6.2.0: 413 | version "6.2.1" 414 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" 415 | integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== 416 | 417 | caseless@~0.12.0: 418 | version "0.12.0" 419 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 420 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 421 | 422 | chalk@^4.1.0: 423 | version "4.1.2" 424 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 425 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 426 | dependencies: 427 | ansi-styles "^4.1.0" 428 | supports-color "^7.1.0" 429 | 430 | chokidar@^3.5.2: 431 | version "3.5.2" 432 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 433 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 434 | dependencies: 435 | anymatch "~3.1.2" 436 | braces "~3.0.2" 437 | glob-parent "~5.1.2" 438 | is-binary-path "~2.1.0" 439 | is-glob "~4.0.1" 440 | normalize-path "~3.0.0" 441 | readdirp "~3.6.0" 442 | optionalDependencies: 443 | fsevents "~2.3.2" 444 | 445 | chownr@^1.1.4: 446 | version "1.1.4" 447 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 448 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 449 | 450 | ci-info@^2.0.0: 451 | version "2.0.0" 452 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 453 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 454 | 455 | cli-boxes@^2.2.1: 456 | version "2.2.1" 457 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 458 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 459 | 460 | clone-response@^1.0.2: 461 | version "1.0.2" 462 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 463 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 464 | dependencies: 465 | mimic-response "^1.0.0" 466 | 467 | co-body@^6.0.0: 468 | version "6.1.0" 469 | resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" 470 | integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== 471 | dependencies: 472 | inflation "^2.0.0" 473 | qs "^6.5.2" 474 | raw-body "^2.3.3" 475 | type-is "^1.6.16" 476 | 477 | co@^4.6.0: 478 | version "4.6.0" 479 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 480 | integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= 481 | 482 | code-point-at@^1.0.0: 483 | version "1.1.0" 484 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 485 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 486 | 487 | color-convert@^2.0.1: 488 | version "2.0.1" 489 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 490 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 491 | dependencies: 492 | color-name "~1.1.4" 493 | 494 | color-name@~1.1.4: 495 | version "1.1.4" 496 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 497 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 498 | 499 | combined-stream@^1.0.6, combined-stream@~1.0.6: 500 | version "1.0.8" 501 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 502 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 503 | dependencies: 504 | delayed-stream "~1.0.0" 505 | 506 | concat-map@0.0.1: 507 | version "0.0.1" 508 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 509 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 510 | 511 | configstore@^5.0.1: 512 | version "5.0.1" 513 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 514 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 515 | dependencies: 516 | dot-prop "^5.2.0" 517 | graceful-fs "^4.1.2" 518 | make-dir "^3.0.0" 519 | unique-string "^2.0.0" 520 | write-file-atomic "^3.0.0" 521 | xdg-basedir "^4.0.0" 522 | 523 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 524 | version "1.1.0" 525 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 526 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 527 | 528 | content-disposition@~0.5.2: 529 | version "0.5.3" 530 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 531 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 532 | dependencies: 533 | safe-buffer "5.1.2" 534 | 535 | content-type@^1.0.4: 536 | version "1.0.4" 537 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 538 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 539 | 540 | cookies@~0.8.0: 541 | version "0.8.0" 542 | resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" 543 | integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== 544 | dependencies: 545 | depd "~2.0.0" 546 | keygrip "~1.1.0" 547 | 548 | copy-to@^2.0.1: 549 | version "2.0.1" 550 | resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" 551 | integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU= 552 | 553 | core-util-is@1.0.2: 554 | version "1.0.2" 555 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 556 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 557 | 558 | core-util-is@^1.0.2, core-util-is@~1.0.0: 559 | version "1.0.3" 560 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 561 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 562 | 563 | crc@^3.4.4: 564 | version "3.8.0" 565 | resolved "https://registry.nlark.com/crc/download/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" 566 | integrity sha1-rWAmnCyFb4wpnixMwN5FVpFAVsY= 567 | dependencies: 568 | buffer "^5.1.0" 569 | 570 | create-require@^1.1.0: 571 | version "1.1.1" 572 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 573 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 574 | 575 | cross-env@^7.0.3: 576 | version "7.0.3" 577 | resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" 578 | integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== 579 | dependencies: 580 | cross-spawn "^7.0.1" 581 | 582 | cross-spawn@^7.0.1: 583 | version "7.0.3" 584 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 585 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 586 | dependencies: 587 | path-key "^3.1.0" 588 | shebang-command "^2.0.0" 589 | which "^2.0.1" 590 | 591 | crypto-random-string@^2.0.0: 592 | version "2.0.0" 593 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 594 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 595 | 596 | dashdash@^1.12.0: 597 | version "1.14.1" 598 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 599 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 600 | dependencies: 601 | assert-plus "^1.0.0" 602 | 603 | debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: 604 | version "3.2.7" 605 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 606 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 607 | dependencies: 608 | ms "^2.1.1" 609 | 610 | debug@^4.0.1, debug@^4.1.1, debug@^4.3.2: 611 | version "4.3.2" 612 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 613 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 614 | dependencies: 615 | ms "2.1.2" 616 | 617 | decode-uri-component@^0.2.0: 618 | version "0.2.0" 619 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 620 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 621 | 622 | decompress-response@^3.3.0: 623 | version "3.3.0" 624 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 625 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 626 | dependencies: 627 | mimic-response "^1.0.0" 628 | 629 | deep-equal@~1.0.1: 630 | version "1.0.1" 631 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 632 | integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= 633 | 634 | deep-extend@^0.6.0: 635 | version "0.6.0" 636 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 637 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 638 | 639 | defer-to-connect@^1.0.1: 640 | version "1.1.3" 641 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 642 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 643 | 644 | delayed-stream@~1.0.0: 645 | version "1.0.0" 646 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 647 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 648 | 649 | delegates@^1.0.0: 650 | version "1.0.0" 651 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 652 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 653 | 654 | depd@^2.0.0, depd@~2.0.0: 655 | version "2.0.0" 656 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 657 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 658 | 659 | depd@~1.1.2: 660 | version "1.1.2" 661 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 662 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 663 | 664 | destroy@^1.0.4: 665 | version "1.0.4" 666 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 667 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 668 | 669 | detect-libc@^1.0.2: 670 | version "1.0.3" 671 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 672 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 673 | 674 | diff@^4.0.1: 675 | version "4.0.2" 676 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 677 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 678 | 679 | dot-prop@^5.2.0: 680 | version "5.3.0" 681 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 682 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 683 | dependencies: 684 | is-obj "^2.0.0" 685 | 686 | duplexer3@^0.1.4: 687 | version "0.1.4" 688 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 689 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 690 | 691 | ecc-jsbn@~0.1.1: 692 | version "0.1.2" 693 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 694 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 695 | dependencies: 696 | jsbn "~0.1.0" 697 | safer-buffer "^2.1.0" 698 | 699 | ee-first@1.1.1: 700 | version "1.1.1" 701 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 702 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 703 | 704 | emoji-regex@^8.0.0: 705 | version "8.0.0" 706 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 707 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 708 | 709 | encodeurl@^1.0.2: 710 | version "1.0.2" 711 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 712 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 713 | 714 | end-of-stream@^1.1.0: 715 | version "1.4.4" 716 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 717 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 718 | dependencies: 719 | once "^1.4.0" 720 | 721 | escape-goat@^2.0.0: 722 | version "2.1.1" 723 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 724 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 725 | 726 | escape-html@^1.0.3: 727 | version "1.0.3" 728 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 729 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 730 | 731 | extend@~3.0.2: 732 | version "3.0.2" 733 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 734 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 735 | 736 | extsprintf@1.3.0: 737 | version "1.3.0" 738 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 739 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 740 | 741 | extsprintf@^1.2.0: 742 | version "1.4.1" 743 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" 744 | integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== 745 | 746 | fast-deep-equal@^3.1.1: 747 | version "3.1.3" 748 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 749 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 750 | 751 | fast-json-stable-stringify@^2.0.0: 752 | version "2.1.0" 753 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 754 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 755 | 756 | fill-range@^7.0.1: 757 | version "7.0.1" 758 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 759 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 760 | dependencies: 761 | to-regex-range "^5.0.1" 762 | 763 | filter-obj@^1.1.0: 764 | version "1.1.0" 765 | resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" 766 | integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= 767 | 768 | follow-redirects@^1.14.0: 769 | version "1.14.5" 770 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" 771 | integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== 772 | 773 | forever-agent@~0.6.1: 774 | version "0.6.1" 775 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 776 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 777 | 778 | form-data@~2.3.2: 779 | version "2.3.3" 780 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 781 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 782 | dependencies: 783 | asynckit "^0.4.0" 784 | combined-stream "^1.0.6" 785 | mime-types "^2.1.12" 786 | 787 | fresh@~0.5.2: 788 | version "0.5.2" 789 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 790 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 791 | 792 | fs-minipass@^1.2.7: 793 | version "1.2.7" 794 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 795 | integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== 796 | dependencies: 797 | minipass "^2.6.0" 798 | 799 | fs.realpath@^1.0.0: 800 | version "1.0.0" 801 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 802 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 803 | 804 | fsevents@~2.3.2: 805 | version "2.3.2" 806 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 807 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 808 | 809 | fstream@^1.0.0, fstream@^1.0.12: 810 | version "1.0.12" 811 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" 812 | integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== 813 | dependencies: 814 | graceful-fs "^4.1.2" 815 | inherits "~2.0.0" 816 | mkdirp ">=0.5 0" 817 | rimraf "2" 818 | 819 | function-bind@^1.1.1: 820 | version "1.1.1" 821 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 822 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 823 | 824 | gauge@~2.7.3: 825 | version "2.7.4" 826 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 827 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 828 | dependencies: 829 | aproba "^1.0.3" 830 | console-control-strings "^1.0.0" 831 | has-unicode "^2.0.0" 832 | object-assign "^4.1.0" 833 | signal-exit "^3.0.0" 834 | string-width "^1.0.1" 835 | strip-ansi "^3.0.1" 836 | wide-align "^1.1.0" 837 | 838 | get-intrinsic@^1.0.2: 839 | version "1.1.1" 840 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 841 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 842 | dependencies: 843 | function-bind "^1.1.1" 844 | has "^1.0.3" 845 | has-symbols "^1.0.1" 846 | 847 | get-stream@^4.1.0: 848 | version "4.1.0" 849 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 850 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 851 | dependencies: 852 | pump "^3.0.0" 853 | 854 | get-stream@^5.1.0: 855 | version "5.2.0" 856 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 857 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 858 | dependencies: 859 | pump "^3.0.0" 860 | 861 | getpass@^0.1.1: 862 | version "0.1.7" 863 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 864 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 865 | dependencies: 866 | assert-plus "^1.0.0" 867 | 868 | glob-parent@~5.1.2: 869 | version "5.1.2" 870 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 871 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 872 | dependencies: 873 | is-glob "^4.0.1" 874 | 875 | glob@^7.0.3, glob@^7.1.3: 876 | version "7.2.0" 877 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 878 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 879 | dependencies: 880 | fs.realpath "^1.0.0" 881 | inflight "^1.0.4" 882 | inherits "2" 883 | minimatch "^3.0.4" 884 | once "^1.3.0" 885 | path-is-absolute "^1.0.0" 886 | 887 | global-dirs@^3.0.0: 888 | version "3.0.0" 889 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" 890 | integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== 891 | dependencies: 892 | ini "2.0.0" 893 | 894 | got@^9.6.0: 895 | version "9.6.0" 896 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 897 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 898 | dependencies: 899 | "@sindresorhus/is" "^0.14.0" 900 | "@szmarczak/http-timer" "^1.1.2" 901 | cacheable-request "^6.0.0" 902 | decompress-response "^3.3.0" 903 | duplexer3 "^0.1.4" 904 | get-stream "^4.1.0" 905 | lowercase-keys "^1.0.1" 906 | mimic-response "^1.0.1" 907 | p-cancelable "^1.0.0" 908 | to-readable-stream "^1.0.0" 909 | url-parse-lax "^3.0.0" 910 | 911 | graceful-fs@^4.1.2: 912 | version "4.2.8" 913 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" 914 | integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== 915 | 916 | har-schema@^2.0.0: 917 | version "2.0.0" 918 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 919 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 920 | 921 | har-validator@~5.1.3: 922 | version "5.1.5" 923 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" 924 | integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== 925 | dependencies: 926 | ajv "^6.12.3" 927 | har-schema "^2.0.0" 928 | 929 | has-flag@^3.0.0: 930 | version "3.0.0" 931 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 932 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 933 | 934 | has-flag@^4.0.0: 935 | version "4.0.0" 936 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 937 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 938 | 939 | has-symbols@^1.0.1, has-symbols@^1.0.2: 940 | version "1.0.2" 941 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 942 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 943 | 944 | has-tostringtag@^1.0.0: 945 | version "1.0.0" 946 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 947 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 948 | dependencies: 949 | has-symbols "^1.0.2" 950 | 951 | has-unicode@^2.0.0: 952 | version "2.0.1" 953 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 954 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 955 | 956 | has-yarn@^2.1.0: 957 | version "2.1.0" 958 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 959 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 960 | 961 | has@^1.0.3: 962 | version "1.0.3" 963 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 964 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 965 | dependencies: 966 | function-bind "^1.1.1" 967 | 968 | http-assert@^1.3.0: 969 | version "1.5.0" 970 | resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" 971 | integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== 972 | dependencies: 973 | deep-equal "~1.0.1" 974 | http-errors "~1.8.0" 975 | 976 | http-cache-semantics@^4.0.0: 977 | version "4.1.0" 978 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 979 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 980 | 981 | http-errors@1.8.1, http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: 982 | version "1.8.1" 983 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" 984 | integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== 985 | dependencies: 986 | depd "~1.1.2" 987 | inherits "2.0.4" 988 | setprototypeof "1.2.0" 989 | statuses ">= 1.5.0 < 2" 990 | toidentifier "1.0.1" 991 | 992 | http-errors@~1.6.2: 993 | version "1.6.3" 994 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 995 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 996 | dependencies: 997 | depd "~1.1.2" 998 | inherits "2.0.3" 999 | setprototypeof "1.1.0" 1000 | statuses ">= 1.4.0 < 2" 1001 | 1002 | http-signature@~1.2.0: 1003 | version "1.2.0" 1004 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 1005 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 1006 | dependencies: 1007 | assert-plus "^1.0.0" 1008 | jsprim "^1.2.2" 1009 | sshpk "^1.7.0" 1010 | 1011 | iconv-lite@0.4.24, iconv-lite@^0.4.4: 1012 | version "0.4.24" 1013 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1014 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1015 | dependencies: 1016 | safer-buffer ">= 2.1.2 < 3" 1017 | 1018 | ieee754@^1.1.13: 1019 | version "1.2.1" 1020 | resolved "https://registry.nlark.com/ieee754/download/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1021 | integrity sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= 1022 | 1023 | ignore-by-default@^1.0.1: 1024 | version "1.0.1" 1025 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 1026 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 1027 | 1028 | ignore-walk@^3.0.1: 1029 | version "3.0.4" 1030 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" 1031 | integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== 1032 | dependencies: 1033 | minimatch "^3.0.4" 1034 | 1035 | import-lazy@^2.1.0: 1036 | version "2.1.0" 1037 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 1038 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 1039 | 1040 | imurmurhash@^0.1.4: 1041 | version "0.1.4" 1042 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1043 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1044 | 1045 | inflation@^2.0.0: 1046 | version "2.0.0" 1047 | resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" 1048 | integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8= 1049 | 1050 | inflight@^1.0.4: 1051 | version "1.0.6" 1052 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1053 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1054 | dependencies: 1055 | once "^1.3.0" 1056 | wrappy "1" 1057 | 1058 | inherits@2, inherits@2.0.4, inherits@~2.0.0, inherits@~2.0.3: 1059 | version "2.0.4" 1060 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1061 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1062 | 1063 | inherits@2.0.3: 1064 | version "2.0.3" 1065 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1066 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1067 | 1068 | ini@2.0.0: 1069 | version "2.0.0" 1070 | resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" 1071 | integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== 1072 | 1073 | ini@~1.3.0: 1074 | version "1.3.8" 1075 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 1076 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 1077 | 1078 | is-binary-path@~2.1.0: 1079 | version "2.1.0" 1080 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1081 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1082 | dependencies: 1083 | binary-extensions "^2.0.0" 1084 | 1085 | is-ci@^2.0.0: 1086 | version "2.0.0" 1087 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 1088 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 1089 | dependencies: 1090 | ci-info "^2.0.0" 1091 | 1092 | is-class-hotfix@~0.0.6: 1093 | version "0.0.6" 1094 | resolved "https://registry.nlark.com/is-class-hotfix/download/is-class-hotfix-0.0.6.tgz#a527d31fb23279281dde5f385c77b5de70a72435" 1095 | integrity sha1-pSfTH7IyeSgd3l84XHe13nCnJDU= 1096 | 1097 | is-extglob@^2.1.1: 1098 | version "2.1.1" 1099 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1100 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1101 | 1102 | is-fullwidth-code-point@^1.0.0: 1103 | version "1.0.0" 1104 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1105 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1106 | dependencies: 1107 | number-is-nan "^1.0.0" 1108 | 1109 | is-fullwidth-code-point@^3.0.0: 1110 | version "3.0.0" 1111 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1112 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1113 | 1114 | is-generator-function@^1.0.7: 1115 | version "1.0.10" 1116 | resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" 1117 | integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== 1118 | dependencies: 1119 | has-tostringtag "^1.0.0" 1120 | 1121 | is-glob@^4.0.1, is-glob@~4.0.1: 1122 | version "4.0.3" 1123 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1124 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1125 | dependencies: 1126 | is-extglob "^2.1.1" 1127 | 1128 | is-installed-globally@^0.4.0: 1129 | version "0.4.0" 1130 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" 1131 | integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== 1132 | dependencies: 1133 | global-dirs "^3.0.0" 1134 | is-path-inside "^3.0.2" 1135 | 1136 | is-npm@^5.0.0: 1137 | version "5.0.0" 1138 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" 1139 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== 1140 | 1141 | is-number@^7.0.0: 1142 | version "7.0.0" 1143 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1144 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1145 | 1146 | is-obj@^2.0.0: 1147 | version "2.0.0" 1148 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 1149 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 1150 | 1151 | is-path-inside@^3.0.2: 1152 | version "3.0.3" 1153 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1154 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1155 | 1156 | is-type-of@^1.0.0: 1157 | version "1.2.1" 1158 | resolved "https://registry.nlark.com/is-type-of/download/is-type-of-1.2.1.tgz#e263ec3857aceb4f28c47130ec78db09a920f8c5" 1159 | integrity sha1-4mPsOFes608oxHEw7HjbCakg+MU= 1160 | dependencies: 1161 | core-util-is "^1.0.2" 1162 | is-class-hotfix "~0.0.6" 1163 | isstream "~0.1.2" 1164 | 1165 | is-typedarray@^1.0.0, is-typedarray@~1.0.0: 1166 | version "1.0.0" 1167 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1168 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1169 | 1170 | is-yarn-global@^0.3.0: 1171 | version "0.3.0" 1172 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 1173 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 1174 | 1175 | isarray@~1.0.0: 1176 | version "1.0.0" 1177 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1178 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1179 | 1180 | isexe@^2.0.0: 1181 | version "2.0.0" 1182 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1183 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1184 | 1185 | isstream@~0.1.2: 1186 | version "0.1.2" 1187 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1188 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 1189 | 1190 | jsbn@~0.1.0: 1191 | version "0.1.1" 1192 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1193 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 1194 | 1195 | json-buffer@3.0.0: 1196 | version "3.0.0" 1197 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 1198 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 1199 | 1200 | json-schema-traverse@^0.4.1: 1201 | version "0.4.1" 1202 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1203 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1204 | 1205 | json-schema@0.2.3: 1206 | version "0.2.3" 1207 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1208 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 1209 | 1210 | json-stringify-safe@~5.0.1: 1211 | version "5.0.1" 1212 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1213 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 1214 | 1215 | jsprim@^1.2.2: 1216 | version "1.4.1" 1217 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1218 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 1219 | dependencies: 1220 | assert-plus "1.0.0" 1221 | extsprintf "1.3.0" 1222 | json-schema "0.2.3" 1223 | verror "1.10.0" 1224 | 1225 | keygrip@~1.1.0: 1226 | version "1.1.0" 1227 | resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" 1228 | integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== 1229 | dependencies: 1230 | tsscmp "1.0.6" 1231 | 1232 | keyv@^3.0.0: 1233 | version "3.1.0" 1234 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 1235 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 1236 | dependencies: 1237 | json-buffer "3.0.0" 1238 | 1239 | koa-bodyparser@^4.3.0: 1240 | version "4.3.0" 1241 | resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a" 1242 | integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw== 1243 | dependencies: 1244 | co-body "^6.0.0" 1245 | copy-to "^2.0.1" 1246 | 1247 | koa-compose@^4.1.0: 1248 | version "4.1.0" 1249 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" 1250 | integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== 1251 | 1252 | koa-convert@^2.0.0: 1253 | version "2.0.0" 1254 | resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" 1255 | integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== 1256 | dependencies: 1257 | co "^4.6.0" 1258 | koa-compose "^4.1.0" 1259 | 1260 | koa-mount@^4.0.0: 1261 | version "4.0.0" 1262 | resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-4.0.0.tgz#e0265e58198e1a14ef889514c607254ff386329c" 1263 | integrity sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ== 1264 | dependencies: 1265 | debug "^4.0.1" 1266 | koa-compose "^4.1.0" 1267 | 1268 | koa-router@^10.0.0: 1269 | version "10.1.1" 1270 | resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-10.1.1.tgz#20809f82648518b84726cd445037813cd99f17ff" 1271 | integrity sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ== 1272 | dependencies: 1273 | debug "^4.1.1" 1274 | http-errors "^1.7.3" 1275 | koa-compose "^4.1.0" 1276 | methods "^1.1.2" 1277 | path-to-regexp "^6.1.0" 1278 | 1279 | koa-send@^5.0.0: 1280 | version "5.0.1" 1281 | resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79" 1282 | integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ== 1283 | dependencies: 1284 | debug "^4.1.1" 1285 | http-errors "^1.7.3" 1286 | resolve-path "^1.4.0" 1287 | 1288 | koa-session@^6.2.0: 1289 | version "6.2.0" 1290 | resolved "https://registry.nlark.com/koa-session/download/koa-session-6.2.0.tgz#c0da2a808b520f62a25dac9f2914b580b2402078" 1291 | integrity sha1-wNoqgItSD2KiXayfKRS1gLJAIHg= 1292 | dependencies: 1293 | crc "^3.4.4" 1294 | debug "^3.1.0" 1295 | is-type-of "^1.0.0" 1296 | uuid "^3.3.2" 1297 | 1298 | koa-static@^5.0.0: 1299 | version "5.0.0" 1300 | resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" 1301 | integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== 1302 | dependencies: 1303 | debug "^3.1.0" 1304 | koa-send "^5.0.0" 1305 | 1306 | koa2-connect-history-api-fallback@^0.1.3: 1307 | version "0.1.3" 1308 | resolved "https://registry.yarnpkg.com/koa2-connect-history-api-fallback/-/koa2-connect-history-api-fallback-0.1.3.tgz#dd07b6183ab111d48a6e14f0896d39397c2b879b" 1309 | integrity sha512-6SucVC8sn7ffaAKOhpNn1OJUqZDK37Jg/PSBAGSribQIikU/Et1aOkUcPH34dm55Kl94RrH4d1snOG6EErzE1Q== 1310 | 1311 | koa@^2.13.1: 1312 | version "2.13.4" 1313 | resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e" 1314 | integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g== 1315 | dependencies: 1316 | accepts "^1.3.5" 1317 | cache-content-type "^1.0.0" 1318 | content-disposition "~0.5.2" 1319 | content-type "^1.0.4" 1320 | cookies "~0.8.0" 1321 | debug "^4.3.2" 1322 | delegates "^1.0.0" 1323 | depd "^2.0.0" 1324 | destroy "^1.0.4" 1325 | encodeurl "^1.0.2" 1326 | escape-html "^1.0.3" 1327 | fresh "~0.5.2" 1328 | http-assert "^1.3.0" 1329 | http-errors "^1.6.3" 1330 | is-generator-function "^1.0.7" 1331 | koa-compose "^4.1.0" 1332 | koa-convert "^2.0.0" 1333 | on-finished "^2.3.0" 1334 | only "~0.0.2" 1335 | parseurl "^1.3.2" 1336 | statuses "^1.5.0" 1337 | type-is "^1.6.16" 1338 | vary "^1.1.2" 1339 | 1340 | latest-version@^5.1.0: 1341 | version "5.1.0" 1342 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 1343 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 1344 | dependencies: 1345 | package-json "^6.3.0" 1346 | 1347 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 1348 | version "1.0.1" 1349 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1350 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1351 | 1352 | lowercase-keys@^2.0.0: 1353 | version "2.0.0" 1354 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 1355 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 1356 | 1357 | lru-cache@^6.0.0: 1358 | version "6.0.0" 1359 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1360 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1361 | dependencies: 1362 | yallist "^4.0.0" 1363 | 1364 | make-dir@^3.0.0: 1365 | version "3.1.0" 1366 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1367 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1368 | dependencies: 1369 | semver "^6.0.0" 1370 | 1371 | make-error@^1.1.1: 1372 | version "1.3.6" 1373 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1374 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1375 | 1376 | media-typer@0.3.0: 1377 | version "0.3.0" 1378 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1379 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1380 | 1381 | methods@^1.1.2: 1382 | version "1.1.2" 1383 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1384 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1385 | 1386 | mime-db@1.51.0: 1387 | version "1.51.0" 1388 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" 1389 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== 1390 | 1391 | mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: 1392 | version "2.1.34" 1393 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" 1394 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== 1395 | dependencies: 1396 | mime-db "1.51.0" 1397 | 1398 | mimic-response@^1.0.0, mimic-response@^1.0.1: 1399 | version "1.0.1" 1400 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1401 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1402 | 1403 | minimatch@^3.0.4: 1404 | version "3.0.4" 1405 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1406 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1407 | dependencies: 1408 | brace-expansion "^1.1.7" 1409 | 1410 | minimist@^1.2.0, minimist@^1.2.5: 1411 | version "1.2.5" 1412 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1413 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1414 | 1415 | minipass@^2.6.0, minipass@^2.9.0: 1416 | version "2.9.0" 1417 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" 1418 | integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== 1419 | dependencies: 1420 | safe-buffer "^5.1.2" 1421 | yallist "^3.0.0" 1422 | 1423 | minizlib@^1.3.3: 1424 | version "1.3.3" 1425 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" 1426 | integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== 1427 | dependencies: 1428 | minipass "^2.9.0" 1429 | 1430 | "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5: 1431 | version "0.5.5" 1432 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1433 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1434 | dependencies: 1435 | minimist "^1.2.5" 1436 | 1437 | ms@2.1.2: 1438 | version "2.1.2" 1439 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1440 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1441 | 1442 | ms@^2.1.1: 1443 | version "2.1.3" 1444 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1445 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1446 | 1447 | needle@^2.2.1: 1448 | version "2.9.1" 1449 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" 1450 | integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== 1451 | dependencies: 1452 | debug "^3.2.6" 1453 | iconv-lite "^0.4.4" 1454 | sax "^1.2.4" 1455 | 1456 | negotiator@0.6.2: 1457 | version "0.6.2" 1458 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1459 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1460 | 1461 | node-addon-api@^3.0.0: 1462 | version "3.2.1" 1463 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" 1464 | integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== 1465 | 1466 | node-gyp@3.x: 1467 | version "3.8.0" 1468 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" 1469 | integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== 1470 | dependencies: 1471 | fstream "^1.0.0" 1472 | glob "^7.0.3" 1473 | graceful-fs "^4.1.2" 1474 | mkdirp "^0.5.0" 1475 | nopt "2 || 3" 1476 | npmlog "0 || 1 || 2 || 3 || 4" 1477 | osenv "0" 1478 | request "^2.87.0" 1479 | rimraf "2" 1480 | semver "~5.3.0" 1481 | tar "^2.0.0" 1482 | which "1" 1483 | 1484 | node-pre-gyp@^0.11.0: 1485 | version "0.11.0" 1486 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" 1487 | integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== 1488 | dependencies: 1489 | detect-libc "^1.0.2" 1490 | mkdirp "^0.5.1" 1491 | needle "^2.2.1" 1492 | nopt "^4.0.1" 1493 | npm-packlist "^1.1.6" 1494 | npmlog "^4.0.2" 1495 | rc "^1.2.7" 1496 | rimraf "^2.6.1" 1497 | semver "^5.3.0" 1498 | tar "^4" 1499 | 1500 | nodemon@^2.0.7: 1501 | version "2.0.15" 1502 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" 1503 | integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA== 1504 | dependencies: 1505 | chokidar "^3.5.2" 1506 | debug "^3.2.7" 1507 | ignore-by-default "^1.0.1" 1508 | minimatch "^3.0.4" 1509 | pstree.remy "^1.1.8" 1510 | semver "^5.7.1" 1511 | supports-color "^5.5.0" 1512 | touch "^3.1.0" 1513 | undefsafe "^2.0.5" 1514 | update-notifier "^5.1.0" 1515 | 1516 | "nopt@2 || 3": 1517 | version "3.0.6" 1518 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1519 | integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= 1520 | dependencies: 1521 | abbrev "1" 1522 | 1523 | nopt@^4.0.1: 1524 | version "4.0.3" 1525 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" 1526 | integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== 1527 | dependencies: 1528 | abbrev "1" 1529 | osenv "^0.1.4" 1530 | 1531 | nopt@~1.0.10: 1532 | version "1.0.10" 1533 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1534 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 1535 | dependencies: 1536 | abbrev "1" 1537 | 1538 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1539 | version "3.0.0" 1540 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1541 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1542 | 1543 | normalize-url@^4.1.0: 1544 | version "4.5.1" 1545 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 1546 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 1547 | 1548 | npm-bundled@^1.0.1: 1549 | version "1.1.2" 1550 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" 1551 | integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== 1552 | dependencies: 1553 | npm-normalize-package-bin "^1.0.1" 1554 | 1555 | npm-normalize-package-bin@^1.0.1: 1556 | version "1.0.1" 1557 | resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" 1558 | integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== 1559 | 1560 | npm-packlist@^1.1.6: 1561 | version "1.4.8" 1562 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" 1563 | integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== 1564 | dependencies: 1565 | ignore-walk "^3.0.1" 1566 | npm-bundled "^1.0.1" 1567 | npm-normalize-package-bin "^1.0.1" 1568 | 1569 | "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2: 1570 | version "4.1.2" 1571 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1572 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1573 | dependencies: 1574 | are-we-there-yet "~1.1.2" 1575 | console-control-strings "~1.1.0" 1576 | gauge "~2.7.3" 1577 | set-blocking "~2.0.0" 1578 | 1579 | number-is-nan@^1.0.0: 1580 | version "1.0.1" 1581 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1582 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1583 | 1584 | oauth-sign@~0.9.0: 1585 | version "0.9.0" 1586 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1587 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 1588 | 1589 | object-assign@^4.1.0: 1590 | version "4.1.1" 1591 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1592 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1593 | 1594 | object-inspect@^1.9.0: 1595 | version "1.11.0" 1596 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" 1597 | integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== 1598 | 1599 | on-finished@^2.3.0: 1600 | version "2.3.0" 1601 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1602 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1603 | dependencies: 1604 | ee-first "1.1.1" 1605 | 1606 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1607 | version "1.4.0" 1608 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1609 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1610 | dependencies: 1611 | wrappy "1" 1612 | 1613 | only@~0.0.2: 1614 | version "0.0.2" 1615 | resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" 1616 | integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= 1617 | 1618 | os-homedir@^1.0.0: 1619 | version "1.0.2" 1620 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1621 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1622 | 1623 | os-tmpdir@^1.0.0: 1624 | version "1.0.2" 1625 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1626 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1627 | 1628 | osenv@0, osenv@^0.1.4: 1629 | version "0.1.5" 1630 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1631 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1632 | dependencies: 1633 | os-homedir "^1.0.0" 1634 | os-tmpdir "^1.0.0" 1635 | 1636 | p-cancelable@^1.0.0: 1637 | version "1.1.0" 1638 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1639 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1640 | 1641 | package-json@^6.3.0: 1642 | version "6.5.0" 1643 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 1644 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 1645 | dependencies: 1646 | got "^9.6.0" 1647 | registry-auth-token "^4.0.0" 1648 | registry-url "^5.0.0" 1649 | semver "^6.2.0" 1650 | 1651 | parseurl@^1.3.2: 1652 | version "1.3.3" 1653 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1654 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1655 | 1656 | path-is-absolute@1.0.1, path-is-absolute@^1.0.0: 1657 | version "1.0.1" 1658 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1659 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1660 | 1661 | path-key@^3.1.0: 1662 | version "3.1.1" 1663 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1664 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1665 | 1666 | path-to-regexp@^6.1.0: 1667 | version "6.2.0" 1668 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38" 1669 | integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== 1670 | 1671 | performance-now@^2.1.0: 1672 | version "2.1.0" 1673 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1674 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 1675 | 1676 | picomatch@^2.0.4, picomatch@^2.2.1: 1677 | version "2.3.0" 1678 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1679 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 1680 | 1681 | prepend-http@^2.0.0: 1682 | version "2.0.0" 1683 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1684 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1685 | 1686 | process-nextick-args@~2.0.0: 1687 | version "2.0.1" 1688 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1689 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1690 | 1691 | psl@^1.1.28: 1692 | version "1.8.0" 1693 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 1694 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 1695 | 1696 | pstree.remy@^1.1.8: 1697 | version "1.1.8" 1698 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 1699 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 1700 | 1701 | pump@^3.0.0: 1702 | version "3.0.0" 1703 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1704 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1705 | dependencies: 1706 | end-of-stream "^1.1.0" 1707 | once "^1.3.1" 1708 | 1709 | punycode@^2.1.0, punycode@^2.1.1: 1710 | version "2.1.1" 1711 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1712 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1713 | 1714 | pupa@^2.1.1: 1715 | version "2.1.1" 1716 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" 1717 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 1718 | dependencies: 1719 | escape-goat "^2.0.0" 1720 | 1721 | qs@^6.5.2: 1722 | version "6.10.1" 1723 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" 1724 | integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== 1725 | dependencies: 1726 | side-channel "^1.0.4" 1727 | 1728 | qs@~6.5.2: 1729 | version "6.5.2" 1730 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1731 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1732 | 1733 | query-string@^7.0.1: 1734 | version "7.0.1" 1735 | resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.0.1.tgz#45bd149cf586aaa582dffc7ec7a8ad97dd02f75d" 1736 | integrity sha512-uIw3iRvHnk9to1blJCG3BTc+Ro56CBowJXKmNNAm3RulvPBzWLRqKSiiDk+IplJhsydwtuNMHi8UGQFcCLVfkA== 1737 | dependencies: 1738 | decode-uri-component "^0.2.0" 1739 | filter-obj "^1.1.0" 1740 | split-on-first "^1.0.0" 1741 | strict-uri-encode "^2.0.0" 1742 | 1743 | raw-body@^2.3.3: 1744 | version "2.4.2" 1745 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" 1746 | integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== 1747 | dependencies: 1748 | bytes "3.1.1" 1749 | http-errors "1.8.1" 1750 | iconv-lite "0.4.24" 1751 | unpipe "1.0.0" 1752 | 1753 | rc@^1.2.7, rc@^1.2.8: 1754 | version "1.2.8" 1755 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1756 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1757 | dependencies: 1758 | deep-extend "^0.6.0" 1759 | ini "~1.3.0" 1760 | minimist "^1.2.0" 1761 | strip-json-comments "~2.0.1" 1762 | 1763 | readable-stream@^2.0.6: 1764 | version "2.3.7" 1765 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1766 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1767 | dependencies: 1768 | core-util-is "~1.0.0" 1769 | inherits "~2.0.3" 1770 | isarray "~1.0.0" 1771 | process-nextick-args "~2.0.0" 1772 | safe-buffer "~5.1.1" 1773 | string_decoder "~1.1.1" 1774 | util-deprecate "~1.0.1" 1775 | 1776 | readdirp@~3.6.0: 1777 | version "3.6.0" 1778 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1779 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1780 | dependencies: 1781 | picomatch "^2.2.1" 1782 | 1783 | registry-auth-token@^4.0.0: 1784 | version "4.2.1" 1785 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" 1786 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== 1787 | dependencies: 1788 | rc "^1.2.8" 1789 | 1790 | registry-url@^5.0.0: 1791 | version "5.1.0" 1792 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 1793 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1794 | dependencies: 1795 | rc "^1.2.8" 1796 | 1797 | request@^2.87.0: 1798 | version "2.88.2" 1799 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 1800 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 1801 | dependencies: 1802 | aws-sign2 "~0.7.0" 1803 | aws4 "^1.8.0" 1804 | caseless "~0.12.0" 1805 | combined-stream "~1.0.6" 1806 | extend "~3.0.2" 1807 | forever-agent "~0.6.1" 1808 | form-data "~2.3.2" 1809 | har-validator "~5.1.3" 1810 | http-signature "~1.2.0" 1811 | is-typedarray "~1.0.0" 1812 | isstream "~0.1.2" 1813 | json-stringify-safe "~5.0.1" 1814 | mime-types "~2.1.19" 1815 | oauth-sign "~0.9.0" 1816 | performance-now "^2.1.0" 1817 | qs "~6.5.2" 1818 | safe-buffer "^5.1.2" 1819 | tough-cookie "~2.5.0" 1820 | tunnel-agent "^0.6.0" 1821 | uuid "^3.3.2" 1822 | 1823 | resolve-path@^1.4.0: 1824 | version "1.4.0" 1825 | resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" 1826 | integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= 1827 | dependencies: 1828 | http-errors "~1.6.2" 1829 | path-is-absolute "1.0.1" 1830 | 1831 | responselike@^1.0.2: 1832 | version "1.0.2" 1833 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1834 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1835 | dependencies: 1836 | lowercase-keys "^1.0.0" 1837 | 1838 | rimraf@2, rimraf@^2.6.1: 1839 | version "2.7.1" 1840 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1841 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1842 | dependencies: 1843 | glob "^7.1.3" 1844 | 1845 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1846 | version "5.1.2" 1847 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1848 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1849 | 1850 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1: 1851 | version "5.2.1" 1852 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1853 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1854 | 1855 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1856 | version "2.1.2" 1857 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1858 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1859 | 1860 | sax@>=0.6.0, sax@^1.2.4: 1861 | version "1.2.4" 1862 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1863 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1864 | 1865 | semver-diff@^3.1.1: 1866 | version "3.1.1" 1867 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 1868 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 1869 | dependencies: 1870 | semver "^6.3.0" 1871 | 1872 | semver@^5.3.0, semver@^5.7.1: 1873 | version "5.7.1" 1874 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1875 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1876 | 1877 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 1878 | version "6.3.0" 1879 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1880 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1881 | 1882 | semver@^7.3.4: 1883 | version "7.3.5" 1884 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 1885 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 1886 | dependencies: 1887 | lru-cache "^6.0.0" 1888 | 1889 | semver@~5.3.0: 1890 | version "5.3.0" 1891 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1892 | integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= 1893 | 1894 | set-blocking@~2.0.0: 1895 | version "2.0.0" 1896 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1897 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1898 | 1899 | setprototypeof@1.1.0: 1900 | version "1.1.0" 1901 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 1902 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 1903 | 1904 | setprototypeof@1.2.0: 1905 | version "1.2.0" 1906 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1907 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1908 | 1909 | shebang-command@^2.0.0: 1910 | version "2.0.0" 1911 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1912 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1913 | dependencies: 1914 | shebang-regex "^3.0.0" 1915 | 1916 | shebang-regex@^3.0.0: 1917 | version "3.0.0" 1918 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1919 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1920 | 1921 | short-uuid@^4.2.0: 1922 | version "4.2.0" 1923 | resolved "https://registry.yarnpkg.com/short-uuid/-/short-uuid-4.2.0.tgz#3706d9e7287ac589dc5ffe324d3e34817a07540b" 1924 | integrity sha512-r3cxuPPZSuF0QkKsK9bBR7u+7cwuCRzWzgjPh07F5N2iIUNgblnMHepBY16xgj5t1lG9iOP9k/TEafY1qhRzaw== 1925 | dependencies: 1926 | any-base "^1.1.0" 1927 | uuid "^8.3.2" 1928 | 1929 | side-channel@^1.0.4: 1930 | version "1.0.4" 1931 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1932 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1933 | dependencies: 1934 | call-bind "^1.0.0" 1935 | get-intrinsic "^1.0.2" 1936 | object-inspect "^1.9.0" 1937 | 1938 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1939 | version "3.0.6" 1940 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 1941 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 1942 | 1943 | source-map-support@^0.5.17: 1944 | version "0.5.21" 1945 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 1946 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 1947 | dependencies: 1948 | buffer-from "^1.0.0" 1949 | source-map "^0.6.0" 1950 | 1951 | source-map@^0.6.0: 1952 | version "0.6.1" 1953 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1954 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1955 | 1956 | split-on-first@^1.0.0: 1957 | version "1.1.0" 1958 | resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" 1959 | integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== 1960 | 1961 | sqlite3@^5.0.2: 1962 | version "5.0.2" 1963 | resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.2.tgz#00924adcc001c17686e0a6643b6cbbc2d3965083" 1964 | integrity sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA== 1965 | dependencies: 1966 | node-addon-api "^3.0.0" 1967 | node-pre-gyp "^0.11.0" 1968 | optionalDependencies: 1969 | node-gyp "3.x" 1970 | 1971 | sshpk@^1.7.0: 1972 | version "1.16.1" 1973 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 1974 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 1975 | dependencies: 1976 | asn1 "~0.2.3" 1977 | assert-plus "^1.0.0" 1978 | bcrypt-pbkdf "^1.0.0" 1979 | dashdash "^1.12.0" 1980 | ecc-jsbn "~0.1.1" 1981 | getpass "^0.1.1" 1982 | jsbn "~0.1.0" 1983 | safer-buffer "^2.0.2" 1984 | tweetnacl "~0.14.0" 1985 | 1986 | "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: 1987 | version "1.5.0" 1988 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1989 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1990 | 1991 | strict-uri-encode@^2.0.0: 1992 | version "2.0.0" 1993 | resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" 1994 | integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= 1995 | 1996 | string-width@^1.0.1: 1997 | version "1.0.2" 1998 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1999 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 2000 | dependencies: 2001 | code-point-at "^1.0.0" 2002 | is-fullwidth-code-point "^1.0.0" 2003 | strip-ansi "^3.0.0" 2004 | 2005 | "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: 2006 | version "4.2.3" 2007 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2008 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2009 | dependencies: 2010 | emoji-regex "^8.0.0" 2011 | is-fullwidth-code-point "^3.0.0" 2012 | strip-ansi "^6.0.1" 2013 | 2014 | string_decoder@~1.1.1: 2015 | version "1.1.1" 2016 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2017 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2018 | dependencies: 2019 | safe-buffer "~5.1.0" 2020 | 2021 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2022 | version "3.0.1" 2023 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2024 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2025 | dependencies: 2026 | ansi-regex "^2.0.0" 2027 | 2028 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2029 | version "6.0.1" 2030 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2031 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2032 | dependencies: 2033 | ansi-regex "^5.0.1" 2034 | 2035 | strip-json-comments@~2.0.1: 2036 | version "2.0.1" 2037 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2038 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2039 | 2040 | supports-color@^5.5.0: 2041 | version "5.5.0" 2042 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2043 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2044 | dependencies: 2045 | has-flag "^3.0.0" 2046 | 2047 | supports-color@^7.1.0: 2048 | version "7.2.0" 2049 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2050 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2051 | dependencies: 2052 | has-flag "^4.0.0" 2053 | 2054 | tar@^2.0.0: 2055 | version "2.2.2" 2056 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" 2057 | integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== 2058 | dependencies: 2059 | block-stream "*" 2060 | fstream "^1.0.12" 2061 | inherits "2" 2062 | 2063 | tar@^4: 2064 | version "4.4.19" 2065 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" 2066 | integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== 2067 | dependencies: 2068 | chownr "^1.1.4" 2069 | fs-minipass "^1.2.7" 2070 | minipass "^2.9.0" 2071 | minizlib "^1.3.3" 2072 | mkdirp "^0.5.5" 2073 | safe-buffer "^5.2.1" 2074 | yallist "^3.1.1" 2075 | 2076 | to-readable-stream@^1.0.0: 2077 | version "1.0.0" 2078 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 2079 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 2080 | 2081 | to-regex-range@^5.0.1: 2082 | version "5.0.1" 2083 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2084 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2085 | dependencies: 2086 | is-number "^7.0.0" 2087 | 2088 | toidentifier@1.0.1: 2089 | version "1.0.1" 2090 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 2091 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 2092 | 2093 | touch@^3.1.0: 2094 | version "3.1.0" 2095 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 2096 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 2097 | dependencies: 2098 | nopt "~1.0.10" 2099 | 2100 | tough-cookie@~2.5.0: 2101 | version "2.5.0" 2102 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 2103 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 2104 | dependencies: 2105 | psl "^1.1.28" 2106 | punycode "^2.1.1" 2107 | 2108 | ts-node@^9.1.1: 2109 | version "9.1.1" 2110 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 2111 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 2112 | dependencies: 2113 | arg "^4.1.0" 2114 | create-require "^1.1.0" 2115 | diff "^4.0.1" 2116 | make-error "^1.1.1" 2117 | source-map-support "^0.5.17" 2118 | yn "3.1.1" 2119 | 2120 | tsscmp@1.0.6: 2121 | version "1.0.6" 2122 | resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" 2123 | integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== 2124 | 2125 | tunnel-agent@^0.6.0: 2126 | version "0.6.0" 2127 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2128 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2129 | dependencies: 2130 | safe-buffer "^5.0.1" 2131 | 2132 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2133 | version "0.14.5" 2134 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2135 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 2136 | 2137 | type-fest@^0.20.2: 2138 | version "0.20.2" 2139 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2140 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2141 | 2142 | type-is@^1.6.16: 2143 | version "1.6.18" 2144 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2145 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2146 | dependencies: 2147 | media-typer "0.3.0" 2148 | mime-types "~2.1.24" 2149 | 2150 | typedarray-to-buffer@^3.1.5: 2151 | version "3.1.5" 2152 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 2153 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 2154 | dependencies: 2155 | is-typedarray "^1.0.0" 2156 | 2157 | typescript@^4.2.3: 2158 | version "4.5.2" 2159 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998" 2160 | integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw== 2161 | 2162 | undefsafe@^2.0.5: 2163 | version "2.0.5" 2164 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 2165 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 2166 | 2167 | unique-string@^2.0.0: 2168 | version "2.0.0" 2169 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 2170 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 2171 | dependencies: 2172 | crypto-random-string "^2.0.0" 2173 | 2174 | unpipe@1.0.0: 2175 | version "1.0.0" 2176 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2177 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2178 | 2179 | update-notifier@^5.1.0: 2180 | version "5.1.0" 2181 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" 2182 | integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== 2183 | dependencies: 2184 | boxen "^5.0.0" 2185 | chalk "^4.1.0" 2186 | configstore "^5.0.1" 2187 | has-yarn "^2.1.0" 2188 | import-lazy "^2.1.0" 2189 | is-ci "^2.0.0" 2190 | is-installed-globally "^0.4.0" 2191 | is-npm "^5.0.0" 2192 | is-yarn-global "^0.3.0" 2193 | latest-version "^5.1.0" 2194 | pupa "^2.1.1" 2195 | semver "^7.3.4" 2196 | semver-diff "^3.1.1" 2197 | xdg-basedir "^4.0.0" 2198 | 2199 | uri-js@^4.2.2: 2200 | version "4.4.1" 2201 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2202 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2203 | dependencies: 2204 | punycode "^2.1.0" 2205 | 2206 | url-parse-lax@^3.0.0: 2207 | version "3.0.0" 2208 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 2209 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 2210 | dependencies: 2211 | prepend-http "^2.0.0" 2212 | 2213 | util-deprecate@~1.0.1: 2214 | version "1.0.2" 2215 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2216 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2217 | 2218 | uuid@^3.3.2: 2219 | version "3.4.0" 2220 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 2221 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 2222 | 2223 | uuid@^8.3.2: 2224 | version "8.3.2" 2225 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 2226 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 2227 | 2228 | vary@^1.1.2: 2229 | version "1.1.2" 2230 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2231 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2232 | 2233 | verror@1.10.0: 2234 | version "1.10.0" 2235 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2236 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 2237 | dependencies: 2238 | assert-plus "^1.0.0" 2239 | core-util-is "1.0.2" 2240 | extsprintf "^1.2.0" 2241 | 2242 | which@1: 2243 | version "1.3.1" 2244 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2245 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2246 | dependencies: 2247 | isexe "^2.0.0" 2248 | 2249 | which@^2.0.1: 2250 | version "2.0.2" 2251 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2252 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2253 | dependencies: 2254 | isexe "^2.0.0" 2255 | 2256 | wide-align@^1.1.0: 2257 | version "1.1.5" 2258 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" 2259 | integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== 2260 | dependencies: 2261 | string-width "^1.0.2 || 2 || 3 || 4" 2262 | 2263 | widest-line@^3.1.0: 2264 | version "3.1.0" 2265 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 2266 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 2267 | dependencies: 2268 | string-width "^4.0.0" 2269 | 2270 | wrap-ansi@^7.0.0: 2271 | version "7.0.0" 2272 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2273 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2274 | dependencies: 2275 | ansi-styles "^4.0.0" 2276 | string-width "^4.1.0" 2277 | strip-ansi "^6.0.0" 2278 | 2279 | wrappy@1: 2280 | version "1.0.2" 2281 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2282 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2283 | 2284 | write-file-atomic@^3.0.0: 2285 | version "3.0.3" 2286 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 2287 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 2288 | dependencies: 2289 | imurmurhash "^0.1.4" 2290 | is-typedarray "^1.0.0" 2291 | signal-exit "^3.0.2" 2292 | typedarray-to-buffer "^3.1.5" 2293 | 2294 | xdg-basedir@^4.0.0: 2295 | version "4.0.0" 2296 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 2297 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 2298 | 2299 | xml2js@^0.4.23: 2300 | version "0.4.23" 2301 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" 2302 | integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== 2303 | dependencies: 2304 | sax ">=0.6.0" 2305 | xmlbuilder "~11.0.0" 2306 | 2307 | xmlbuilder@~11.0.0: 2308 | version "11.0.1" 2309 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" 2310 | integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 2311 | 2312 | yallist@^3.0.0, yallist@^3.1.1: 2313 | version "3.1.1" 2314 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2315 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2316 | 2317 | yallist@^4.0.0: 2318 | version "4.0.0" 2319 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2320 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2321 | 2322 | ylru@^1.2.0: 2323 | version "1.2.1" 2324 | resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" 2325 | integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== 2326 | 2327 | yn@3.1.1: 2328 | version "3.1.1" 2329 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2330 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2331 | --------------------------------------------------------------------------------