├── .eslintrc.js ├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── bin └── pxder ├── index.js ├── package.json ├── src ├── downloader.js ├── illust.js ├── illustrator.js ├── index.js ├── logError.js ├── pixiv-api-client-mod.js ├── pixiv-login.js ├── protocol │ ├── config.js │ ├── index.js │ ├── receiver.js │ └── sender.js ├── proxy.js ├── tools.js └── updateChecker.js └── yarn.lock /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | es2021: true, 4 | node: true, 5 | }, 6 | extends: ['standard'], 7 | parserOptions: { 8 | ecmaVersion: 12, 9 | sourceType: 'module', 10 | }, 11 | rules: { 12 | curly: 'off', 13 | camelcase: 'off', 14 | 'no-case-declarations': 'off', 15 | semi: ['error', 'always'], 16 | 'comma-dangle': ['error', 'only-multiline'], 17 | 'space-before-function-paren': 'off', 18 | 'no-tabs': 'off', 19 | indent: 'off', 20 | eqeqeq: 'off', 21 | 'no-async-promise-executor': 'off', 22 | 'no-control-regex': 'off', 23 | 'prefer-promise-reject-errors': 'off', 24 | }, 25 | }; 26 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | bin/* text eol=lf 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 2 | patreon: # Replace with a single Patreon username 3 | open_collective: # Replace with a single Open Collective username 4 | ko_fi: jindaikirin 5 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 6 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 7 | liberapay: # Replace with a single Liberapay username 8 | issuehunt: # Replace with a single IssueHunt username 9 | otechie: # Replace with a single Otechie username 10 | custom: ['https://afdian.net/@jindaikirin'] 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /test 2 | /package-lock.json 3 | 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | 11 | # Runtime data 12 | pids 13 | *.pid 14 | *.seed 15 | *.pid.lock 16 | 17 | # Directory for instrumented libs generated by jscoverage/JSCover 18 | lib-cov 19 | 20 | # Coverage directory used by tools like istanbul 21 | coverage 22 | 23 | # nyc test coverage 24 | .nyc_output 25 | 26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 27 | .grunt 28 | 29 | # Bower dependency directory (https://bower.io/) 30 | bower_components 31 | 32 | # node-waf configuration 33 | .lock-wscript 34 | 35 | # Compiled binary addons (https://nodejs.org/api/addons.html) 36 | build/Release 37 | 38 | # Dependency directories 39 | node_modules/ 40 | jspm_packages/ 41 | 42 | # TypeScript v1 declaration files 43 | typings/ 44 | 45 | # Optional npm cache directory 46 | .npm 47 | 48 | # Optional eslint cache 49 | .eslintcache 50 | 51 | # Optional REPL history 52 | .node_repl_history 53 | 54 | # Output of 'npm pack' 55 | *.tgz 56 | 57 | # Yarn Integrity file 58 | .yarn-integrity 59 | 60 | # dotenv environment variables file 61 | .env 62 | 63 | # next.js build output 64 | .next 65 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 200, 3 | "singleQuote": true, 4 | "trailingComma": "es5", 5 | "arrowParens": "avoid", 6 | "useTabs": false, 7 | "tabWidth": 2, 8 | "semi": true 9 | } 10 | -------------------------------------------------------------------------------- /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 | . -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pixiv downloader 2 | 3 | > 由于 Pixiv 已不再支持客户端的登录 API,请更新到 v2.12.0 及以后的版本以使用新的登录方式(详见下文) 4 | > 5 | > 本项目因本人不再使用且摸了而进入仅维护状态,暂不考虑任何非必要的 Feature Request 6 | 7 | ![运行示例](https://i.loli.net/2018/08/20/5b7aaccfb1c4a.gif) 8 | 9 | 简单写下说明(主要针对 Windows 用户) 10 | 11 | ## 准备 12 | 13 | 首先你需要先安装 Node.js >= 16 14 | 15 | ### Windows / Mac 16 | 17 | 打开[官网](https://nodejs.org) => 下载左边的 LTS 版本 => 安装一路确定 18 | 19 | ### Linux 20 | 21 | ```bash 22 | # Ubuntu 23 | curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash - 24 | sudo apt-get install -y nodejs 25 | 26 | # Debian 27 | curl -sL https://deb.nodesource.com/setup_16.x | bash - 28 | apt-get install -y nodejs 29 | 30 | # Centos 31 | curl -sL https://rpm.nodesource.com/setup_16.x | bash - 32 | yum install -y nodejs 33 | ``` 34 | 35 | ## 安装/更新/卸载 36 | 37 | Windows 打开“命令提示符”或者“Powershell”,执行下面的命令,即可安装或者更新(注:后续命令皆为在此执行) 38 | 39 | ```bash 40 | npm i -g pxder 41 | ``` 42 | 43 | 如需卸载,执行 44 | 45 | ```bash 46 | npm uninstall -g pxder 47 | ``` 48 | 49 | ## 配置 50 | 51 | 不同计算机用户的数据是独立储存的,互不影响 52 | 53 | ### 登录 54 | 55 | ```bash 56 | pxder --login 57 | ``` 58 | 59 | #### Windows 60 | 61 | 正常情况下应该会自动弹出浏览器访问一个登录授权页面,如果没有的话请手动打开“Login URL”,操作下去即可 62 | 63 | 登录成功时浏览器会弹出如下图所示的一个对话框,选择“打开”即可,这时 pxder 应该会显示登录成功 64 | 65 | ![打开应用](https://i.loli.net/2021/02/13/1nYi8Vvjf9TkcuP.png) 66 | 67 | 如果你的体验与上述情况不一致,请使用 `pxder --login --no-protocol` 命令进行登录,并参考下面的“其他系统”部分进行操作 68 | 69 | #### 其他系统 70 | 71 | 正常情况下应该会自动弹出浏览器访问一个登录授权页面,如果没有的话请手动打开“Login URL”,不要急着登录或授权,按以下步骤操作: 72 | 73 | 1. 按下 F12 打开“开发者工具”,切换到“Network”选项卡,勾选“Preserve log” 74 | 2. 进行登录或授权操作,最终会进入一个空白页面 75 | 3. 点击“Doc”进行筛选,找到(一般是)最后一个请求,将 `code` 参数复制出来,粘贴到程序中并回车 76 | 77 | 以上步骤尽量快速完成,太慢的话验证可能会过期 78 | 79 | ![开发者工具](https://i.loli.net/2021/02/12/jGr1nyMUsxKwTXh.png) 80 | 81 | ### 登出 82 | 83 | ```bash 84 | pxder --logout 85 | ``` 86 | 87 | 仅会删除计算机当前用户储存的 refresh token,在其他计算机或用户上登录的不受影响 88 | 89 | ### 登录态复制 90 | 91 | 如果你有一个已经登陆了的 pxder,那么你可以通过以下步骤将登录态复制到另一个 pxder 上 92 | 93 | 1. 在已经登录了的设备上执行 `pxder --export-token`,保存好该 token 94 | 2. 在另一个设备上执行 `pxder --login TOKEN`,将 `TOKEN` 替换成上一步输出的 token 95 | 96 | ### 设置 97 | 98 | 进入 Pxder 的设置界面 99 | 100 | ```bash 101 | pxder --setting 102 | ``` 103 | 104 | 有六项设置,按下数字键选择一项进行设置 105 | 106 | ```bash 107 | [1] Download path # 下载目录,必须设置 108 | [2] Download thread # 下载线程数 109 | [3] Download timeout # 下载超时 110 | [4] Auto rename # 自动重命名(文件夹) 111 | [5] Proxy # 使用代理 112 | ``` 113 | 114 | - **下载目录** 115 | 请注意相对路径与绝对路径的区别,不过不用担心,输入完路径后会显示绝对路径以方便你检查 116 | 目录无需手动建立,下载图片的时候会自动建立 117 | - **下载线程数** 118 | 即同时下载的图片数,默认为 `5`,最小为 `1`,最大为 `32` 119 | 下载图片时最左侧的一列实际上就是线程编号 120 | - **下载超时及重试** 121 | 如果这么多秒之后一张图还没被下载完则算作超时,超时后会自动重试,默认值为`30` 122 | 下载图片时如果线程编号是黄色底的就代表此次是重试 123 | 重试超过 `10` 次则视作下载失败 124 | - **自动重命名** 125 | 开启了以后,例如这个画师原来叫 `abc`,今天你再次去下载(更新)他的画作,但是他改名叫 `def` 了,那么程序会自动帮你重命名画师文件夹 126 | - **使用代理** 127 | 支持使用 HTTP 或 SOCKS 代理,即可以使用小飞机 128 | 输入格式为 `<协议>://[用户名:密码@]:<端口>`,例如: 129 | - `http://user:passwd@127.0.0.1:1080` 130 | - `socks://127.0.0.1:1080`(如果你使用小飞机则直接填这个,除非你改过本地端口) 131 | 132 | 如果输入空行则会尝试从环境变量中依次读取 `all_proxy` `https_proxy` `http_proxy`(也包含全大写的环境变量) 133 | 如果想完全禁止使用代理,请输入 `disable` 134 | - **直连模式** 135 | ~~利用域前置(Domain Fronting)绕过 SNI 审查,达到直连使用的目的~~ 136 | ~~直连模式不能和代理同时使用~~ 137 | 已被移除,不再维护,请使用其他工具代替,例如 [Watt Toolkit](https://steampp.net/) 138 | 139 | ## 说明 140 | 141 | - 由于历史设计原因,pxder 在大批量下载方面比较无力且容易出错终止(主要受 API 限制),因此不建议使用 pxder 下载数量较大的已收藏作品,比较推荐其他以画师为单位下载的模式 142 | - 会将同一画师的作品下载在 `(UID)画师名` 格式的文件夹内,图片命名格式为 `(PID)作品名` 143 | 并且,画师名会自动删除名字中 `@`(包含半角&全角)符号及以后的文字(因为这些基本上都是画师的摊位信息之类的与名字无关的信息) 144 | - 文件(夹)名均会过滤掉所有 Windows 和 Linux 中不能或不推荐做文件名的符号 145 | - 动图下下来会是所有帧的压缩包,并且会标注 delay 信息 146 | - 例如 `xxx@30ms.zip` 表示该动图的播放速度为 30ms 一帧 147 | - 由于获取动图信息需要额外调用 API,因此如果动图较多将会使得解析时间较长,可以通过`-M`参数跳过解析 148 | - 目前没有自动转 gif / mp4 / webm 的功能,但在计划中,什么时候写看心情 149 | - 下载时会智能跳过已经下载完成的插画 150 | - 下载超时或网络错误会自动重试,重试上限为10次 151 | - 若状态码为 404 则直接放弃下载,这种大多是P站自身原因导致的图片问题 152 | - 如果当某一个线程达到重试上限并且此时有不止一个下载线程处于重试状态,程序将视为暂时出现了网络问题,暂停5分钟后会继续重试 153 | - 如果只有一个下载线程出现错误,视为不明原因错误,程序将会放弃下载该p并继续运行 154 | - 抗连接重置,解析时连接重置会自动重试 155 | 156 | ## 开始使用 157 | 158 | 如果需要终止程序,请在命令行中按下 Ctrl C 或者直接关闭命令行窗口 159 | 160 | 请不要吐槽为什么在 Windows 下 Ctrl C 后提示的 `终止批处理操作吗(Y/N)?` 不管是 Y 还是 N 都依然会终止,因为 Node 捕捉到 Ctrl C 就自己终止了,Windows 晚了一步(。 161 | 162 | 欲查看完整命令帮助请执行 `pxder -h` 163 | 164 | ### (1) 下载或更新某画师的所有插画作品 165 | 166 | 使用 `-u` 或 `--uid` 参数,后跟画师的 UID,可单个可多个,如果多个则用英文半角逗号隔开 167 | 168 | ```bash 169 | pxder -u uid1,uid2,uid3,... 170 | ``` 171 | 172 | 例如 173 | 174 | ```bash 175 | pxder -u 5899479,724607,11597411 176 | ``` 177 | 178 | ### (2) 下载或更新你关注的所有画师的所有插画作品 179 | 180 | 该操作同时也会更新已下载的关注画师的作品,并且效率远高于 (3),比较推荐使用 181 | 182 | 会自动排除 pixiv事務局 (uid=`11`) 183 | 184 | 由于收集关注信息需时较久,因此特地针对该功能做了信息缓存:如果你在下载中途退出,那么下次使用该功能时并不需要重新收集,而是利用上次的缓存立即继续下载。 185 | 186 | - 公开关注与私密关注的缓存是分开的,互不干扰 187 | - 如果你需要强制重新收集画师信息(忽略上次的缓存),请在运行命令时加入 `--force` 参数 188 | 189 | #### 公开关注的画师 190 | 191 | ```bash 192 | pxder -f 193 | # 或 194 | pxder --follow 195 | ``` 196 | 197 | #### 私密关注的画师 198 | 199 | ```bash 200 | pxder -F 201 | # 或 202 | pxder --follow--private 203 | ``` 204 | 205 | ### (3) 更新已下载的画师的画作 206 | 207 | 会对下载目录中检测到的所有下载过的画师的插画进行增量更新下载 208 | 209 | 与 (2) 的区别是可以更新你使用 (1) 下载了的但是未关注的画师的插画,但是效率远低于 (2) 210 | 211 | ```bash 212 | pxder -U 213 | # 或 214 | pxder --update 215 | ``` 216 | 217 | ### (4) 下载或更新你的收藏中的插画作品 218 | 219 | #### 公开收藏 220 | 221 | 插画会被下载至 `[bookmark] Public` 文件夹中 222 | 223 | ```bash 224 | pxder -b 225 | # 或 226 | pxder --bookmark 227 | ``` 228 | 229 | #### 私密收藏 230 | 231 | 插画会被下载至 `[bookmark] Private` 文件夹中 232 | 233 | ```bash 234 | pxder -B 235 | # 或 236 | pxder --bookmark--private 237 | ``` 238 | 239 | ### (5) 根据指定 PID 下载插画 240 | 241 | 插画会被下载至 `PID` 文件夹中 242 | 243 | ```bash 244 | pxder -p pid1,pid2,pid3,... 245 | ``` 246 | 247 | 例如 248 | 249 | ```bash 250 | pxder -p 70593670,70594912,70595516 251 | ``` 252 | 253 | ### 其他参数说明 254 | 255 | - `-M` 或 `--no-ugoira-meta` 256 | 下载动图时不请求其元数据,在下列情况下会有帮助 257 | 1. 对动图的帧间隔信息无所谓,不请求可以节省大量解析时间 258 | 2. 画师是专门画动图的,几百张动图解析起来实在是慢,并且动图太多可能导致达到 API 调用速率限制 259 | - `--debug` 260 | 出错时输出详细的错误信息,如果你发现了 bug 想要提 issue,请尽量附上加了该参数时的错误日志 261 | - `--output-config-dir` 262 | 输出 pxder 的配置存放路径 263 | -------------------------------------------------------------------------------- /bin/pxder: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict'; 4 | 5 | require('colors'); 6 | const Path = require('path'); 7 | const Pixiv = require('../src/index'); 8 | const pixivLogin = require('../src/pixiv-login'); 9 | const UpdateChecker = require('../src/updateChecker'); 10 | const logError = require('../src/logError'); 11 | const pkg = require('../package.json'); 12 | const { checkProxy } = require('../src/proxy'); 13 | const LoginProtocol = require('../src/protocol'); 14 | const receiveLoginCode = require('../src/protocol/receiver'); 15 | 16 | const program = require('commander'); 17 | const readline = require('readline-sync'); 18 | const prompts = require('prompts'); 19 | const open = require('open'); 20 | 21 | /* 22 | * Usage 23 | */ 24 | 25 | const optionNewLine = '\n '; 26 | 27 | program 28 | .usage('') 29 | .option(' --login [token]', 'login Pixiv') 30 | .option(' --logout', 'logout Pixiv') 31 | .option(' --no-protocol', 'use with --login to login without pixiv:// registration on Windows') 32 | .option('') 33 | .option(' --setting', 'open options menu') 34 | .option('') 35 | .option('-p, --pid ', 'download illusts by PID, multiple PIDs separated by commas (,)') 36 | .option('-u, --uid ', 'download / update illusts by UID, multiple UIDs separated by commas (,)') 37 | .option('') 38 | .option('-f, --follow', 'download / update illusts from your public follows') 39 | .option('-F, --follow-private', 'download / update illusts from your private follows') 40 | .option(' --force', 'ignore last progress') 41 | .option('') 42 | .option('-b, --bookmark', 'download / update illusts from your public bookmark') 43 | .option('-B, --bookmark-private', 'download / update illusts from your private bookmark') 44 | .option('') 45 | .option('-U, --update', "update all illustrators' illusts in your download path") 46 | .option('') 47 | .option('-M, --no-ugoira-meta', `will not request meta data for ugoira, it helps save time or${optionNewLine}avoid API rate limit error when downloading a tons of ugoiras`) 48 | .option('') 49 | .option('-O, --output-dir ', 'Specify download directory') 50 | .option('') 51 | .option(' --debug', 'output all error messages while running') 52 | .option(' --output-config-dir', 'output the directory of config and exit') 53 | .option(' --export-token', 'output current refresh token and exit') 54 | .option('') 55 | .version(pkg.version, '-v, --version') 56 | .parse(process.argv); 57 | 58 | /* 59 | * Start 60 | */ 61 | const config = Pixiv.readConfig(); 62 | 63 | handleArgv() 64 | .then(async () => { 65 | // 检查配置 66 | if (!Pixiv.checkConfig(config)) { 67 | console.log('\nRun ' + 'pxder -h'.yellow + ' for more usage information.\n'); 68 | process.exit(); 69 | } 70 | 71 | // 导出 refresh token 72 | if (program.exportToken) { 73 | console.log(config.refresh_token); 74 | process.exit(); 75 | } 76 | 77 | Pixiv.applyConfig(config); 78 | 79 | // 检查更新 80 | const updater = new UpdateChecker(); 81 | const updateChecking = updater.check(); 82 | const logNewVersionAndExit = () => { 83 | if (updater.haveUpdate()) { 84 | console.log(`New version ${updater.getLatestVersion().yellow} is available.`); 85 | console.log(`You can upgrade via the '${'npm i -g pxder'.yellow}' command.\n`); 86 | } 87 | process.exit(); 88 | }; 89 | 90 | // 重登陆 91 | const pixiv = new Pixiv(); 92 | await pixiv.relogin(); 93 | 94 | // 开始下载 95 | console.log('\nDownload Path:\t'.cyan + config.download.path.toString().yellow); 96 | if (typeof config.proxy == 'string' && config.proxy.length > 0) console.log('Using Proxy:\t'.cyan + config.proxy.yellow); 97 | 98 | if (program.follow) await pixiv.downloadFollowAll(false, program.force); 99 | if (program.followPrivate) await pixiv.downloadFollowAll(true, program.force); 100 | if (program.update) await pixiv.downloadUpdate(); 101 | if (program.bookmark) await pixiv.downloadBookmark(); 102 | if (program.bookmarkPrivate) await pixiv.downloadBookmark(true); 103 | 104 | if (program.uid) { 105 | // 得到UID 106 | let uids = program.uid; 107 | if (typeof uids == 'string') { 108 | uids = uids.split(','); 109 | await pixiv.downloadByUIDs(uids); 110 | } else help(); 111 | } 112 | if (program.pid) { 113 | // 得到PID 114 | let pids = program.pid; 115 | if (typeof pids == 'string') { 116 | pids = pids.split(','); 117 | await pixiv.downloadByPIDs(pids); 118 | } else help(); 119 | } 120 | 121 | if (!(program.follow || program.followPrivate || program.update || program.bookmark || program.bookmarkPrivate || program.uid || program.pid)) help(); 122 | 123 | pixiv.clearReloginInterval(); 124 | console.log(); 125 | 126 | if (updater.recentlyChecked()) logNewVersionAndExit(); 127 | else { 128 | updateChecking.then(logNewVersionAndExit); 129 | setTimeout(logNewVersionAndExit, 3000); 130 | } 131 | }) 132 | .catch(e => { 133 | if (global.p_debug) logError(e); 134 | else { 135 | let errMsg; 136 | if ((errMsg = e.errors && e.errors.system && e.errors.system.message)) { 137 | console.error(`\n${'ERROR:'.red} ${errMsg}\n`); 138 | if (errMsg === 'Invalid refresh token') { 139 | console.log('Maybe CLIENT_ID and CLIENT_SECRET are updated, please try to relogin.\n'.yellow); 140 | } 141 | } else logError(e); 142 | } 143 | process.exit(); 144 | }); 145 | 146 | async function handleArgv() { 147 | if (program.outputConfigDir) { 148 | console.log(require('appdata-path').getAppDataPath('pxder')); 149 | process.exit(); 150 | } 151 | 152 | // 全局参数 153 | if (program.debug) global.p_debug = true; 154 | global.ugoiraMeta = program.ugoiraMeta; 155 | 156 | // 清理 protocol 157 | if (process.platform === 'win32' && (await LoginProtocol.exists())) { 158 | await LoginProtocol.uninstall(); 159 | } 160 | 161 | // 其他选项 162 | let pass = false; 163 | if (program.login) { 164 | // 登录 165 | console.log('\nPixiv Login\n'.cyan); 166 | try { 167 | Pixiv.applyProxyConfig(config); 168 | if (typeof program.login === 'string') { 169 | // token 登录 170 | const token = program.login.trim(); 171 | console.log('Login with refresh token', token.yellow); 172 | await Pixiv.loginByToken(token); 173 | } else { 174 | // OAuth 登录 175 | const { login_url, code_verifier } = pixivLogin(); 176 | let code; 177 | if (process.platform === 'win32' && program.protocol && (await LoginProtocol.canInstall()) && (await LoginProtocol.install())) { 178 | console.log('Login URL:', login_url.cyan); 179 | console.log('Waiting login... More details:', 'https://git.io/Jt6Lj'.cyan); 180 | open(login_url); 181 | code = await receiveLoginCode(); 182 | await LoginProtocol.uninstall(); 183 | } else { 184 | console.log('Before login, please read this first ->', 'https://git.io/Jt6Lj'.cyan); 185 | if (!readline.keyInYN('Continue?')) process.exit(); 186 | console.log('\nLogin URL:', login_url.cyan); 187 | open(login_url); 188 | code = (() => { 189 | while (true) { 190 | const input = readline.question('Code: '.yellow); 191 | if (input) return input; 192 | } 193 | })(); 194 | } 195 | await Pixiv.login(code, code_verifier); 196 | } 197 | console.log('\nLogin success!\n'.green); 198 | } catch (error) { 199 | console.log('\nLogin fail!'.red, 'Please check your input or proxy setting.\n'); 200 | if (global.p_debug) console.error(error); 201 | } 202 | } else if (program.logout) { 203 | // 登出 204 | Pixiv.logout(); 205 | console.log('\nLogout success!\n'.green); 206 | } else if (program.setting) { 207 | // 设置 208 | let index; 209 | do { 210 | console.clear(); 211 | console.log('Pxder Options'.green); 212 | const options = [ 213 | 'Download path\t'.yellow + (config.download.path ? config.download.path : 'Null, please set one'.bgRed), 214 | 'Download thread\t'.yellow + config.download.thread, 215 | 'Download timeout\t'.yellow + config.download.timeout, 216 | 'Auto rename\t\t'.yellow + (config.download.autoRename ? 'Enabled' : 'Disabled'), 217 | 'Proxy\t\t'.yellow + (checkProxy(config.proxy) && config.proxy ? (config.proxy === 'disable' ? 'Disabled' : config.proxy) : 'From env vars'), 218 | ]; 219 | index = readline.keyInSelect(options, 'Press a key:', { 220 | cancel: 'Exit'.bgMagenta, 221 | }); 222 | console.log(); 223 | 224 | switch (index) { 225 | case 0: // 下载路径 226 | const initial = config.download.path || ''; 227 | config.download.path = 228 | ( 229 | await prompts({ 230 | type: 'text', 231 | name: 'value', 232 | message: 'Please input a download path'.yellow, 233 | format: v => Path.resolve(v.trim()), 234 | initial, 235 | }) 236 | ).value || initial; 237 | break; 238 | 239 | case 1: // 下载线程 240 | config.download.thread = getStrictIntInput( 241 | 'Please input the number of download thread:'.yellow + ' [1-32, default is 5]\n', 242 | { 243 | defaultInput: 5, 244 | }, 245 | input => input >= 1 && input <= 32, 246 | 'It must be between 1 and 32.' 247 | ); 248 | break; 249 | 250 | case 2: // 下载超时 251 | config.download.timeout = getStrictIntInput( 252 | 'Please input the seconds of download timeout:'.yellow + ' [default is 30]\n', 253 | { 254 | defaultInput: 30, 255 | }, 256 | input => input > 0, 257 | 'It must be greater than 0.' 258 | ); 259 | break; 260 | 261 | case 3: // 自动重命名 262 | config.download.autoRename = !config.download.autoRename; 263 | break; 264 | 265 | case 4: // 代理设置 266 | config.proxy = readline.question( 267 | 'Please input your HTTP/SOCKS proxy like:\n'.yellow + 268 | ' ://[user:passwd@][:]\n' + 269 | ' can be http(s) / socks(4|4a|5|5h) / pac+(http|https|ftp|file)\n' + 270 | 'Example\n'.yellow + 271 | ' http://127.0.0.1:1080\n' + 272 | ' socks://127.0.0.1:7890\n' + 273 | 'If you input nothing, pxder will load proxy from environment variables if avaliable.\n'.yellow + 274 | 'If you want to fully DISABLE it, please input '.yellow + 275 | 'disable'.red + 276 | '.\n'.yellow, 277 | { 278 | limitMessage: '\nIncorrect format, please re-input.\n'.bgRed, 279 | limit: checkProxy, 280 | } 281 | ); 282 | break; 283 | } // switch end 284 | 285 | Pixiv.writeConfig(config); 286 | } while (index !== -1); 287 | 288 | console.log('Exit'.green); 289 | } else { 290 | pass = true; 291 | } 292 | if (!pass) process.exit(); 293 | 294 | if (program.outputDir) { 295 | config.download.path = Path.resolve(program.outputDir); 296 | } 297 | } 298 | 299 | function getStrictIntInput(question, option, limit, limitReply) { 300 | let result = readline.questionInt(question, option); 301 | while (!limit(result)) { 302 | console.log('\n' + limitReply.bgRed + '\n'); 303 | result = readline.questionInt(question, option); 304 | } 305 | return result; 306 | } 307 | 308 | function help() { 309 | console.error('\nMissing arguments!'.bgRed); 310 | program.outputHelp(); 311 | } 312 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | console.log('Nothing here ('); 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pxder", 3 | "version": "2.12.10", 4 | "description": "Download illusts from pixiv.net P站插画批量下载器", 5 | "main": "index.js", 6 | "dependencies": { 7 | "appdata-path": "^1.0.0", 8 | "axios": "^0.24.0", 9 | "colors": "1.4.0", 10 | "commander": "^5.1.0", 11 | "compare-versions": "^4.1.4", 12 | "fs-extra": "^11.1.1", 13 | "js-base64": "^3.7.5", 14 | "latest-version": "^5.1.0", 15 | "lodash.flatmap": "^4.5.0", 16 | "node-abort-controller": "^3.1.1", 17 | "open": "^8.4.2", 18 | "pixiv-api-client": "^0.25.0", 19 | "prompts": "^2.4.2", 20 | "proxy-agent": "^6.2.1", 21 | "readline-sync": "^1.4.10", 22 | "register-protocol-win32": "^1.1.0" 23 | }, 24 | "devDependencies": { 25 | "@tsuk1ko/postversion": "^1.0.2", 26 | "@types/eslint": "^8.40.0", 27 | "@types/fs-extra": "^11.0.1", 28 | "@types/lodash.flatmap": "^4.5.7", 29 | "@types/prompts": "^2.4.4", 30 | "@types/readline-sync": "^1.4.4", 31 | "eslint": "^8.41.0", 32 | "eslint-config-standard": "^17.1.0", 33 | "eslint-plugin-import": "^2.27.5", 34 | "eslint-plugin-node": "^11.1.0", 35 | "eslint-plugin-promise": "^6.1.1", 36 | "eslint-plugin-standard": "^5.0.0" 37 | }, 38 | "scripts": { 39 | "postversion": "tpv && npm publish" 40 | }, 41 | "bin": { 42 | "pxder": "./bin/pxder" 43 | }, 44 | "files": [ 45 | "bin", 46 | "src" 47 | ], 48 | "repository": { 49 | "type": "git", 50 | "url": "git+https://github.com/Tsuk1ko/pxder.git" 51 | }, 52 | "keywords": [ 53 | "pixiv", 54 | "downloader", 55 | "illust" 56 | ], 57 | "author": "Jindai Kirin", 58 | "license": "GPL-3.0-or-later", 59 | "bugs": { 60 | "url": "https://github.com/Tsuk1ko/pxder/issues" 61 | }, 62 | "homepage": "https://github.com/Tsuk1ko/pxder#readme" 63 | } 64 | -------------------------------------------------------------------------------- /src/downloader.js: -------------------------------------------------------------------------------- 1 | require('colors'); 2 | const Illust = require('./illust'); 3 | const Fse = require('fs-extra'); 4 | const Path = require('path'); 5 | const Tools = require('./tools'); 6 | const { UgoiraDir } = Tools; 7 | 8 | const pixivRefer = 'https://www.pixiv.net/'; 9 | 10 | let config; 11 | let httpsAgent = false; 12 | 13 | function setConfig(conf) { 14 | config = conf; 15 | } 16 | 17 | function setAgent(agent) { 18 | httpsAgent = agent; 19 | } 20 | 21 | /** 22 | * 下载画师们的画作 23 | * 24 | * @param {Array} illustrators 画师数组 25 | * @param {Function} callback 每成功下载完一个画师时运行的回调 26 | */ 27 | async function downloadByIllustrators(illustrators, callback) { 28 | for (const i in illustrators) { 29 | const illustrator = illustrators[i]; 30 | 31 | const error = await illustrator 32 | .info() 33 | .then(() => null) 34 | .catch(e => e); 35 | if (error) { 36 | if (error instanceof Error) console.log(error); 37 | else console.log('\nIllustrator ' + 'uid '.gray + illustrator.id.toString().cyan + ' may have left pixiv or does not exist.'); 38 | continue; 39 | } 40 | 41 | console.log('\nCollecting illusts of ' + (parseInt(i) + 1).toString().green + '/' + illustrators.length + ' uid '.gray + illustrator.id.toString().cyan + ' ' + illustrator.name.yellow); 42 | 43 | // 取得下载信息 44 | const info = await getDownloadListByIllustrator(illustrator); 45 | 46 | // 下载 47 | await downloadIllusts(info.illusts, Path.join(config.path, info.dir), config.thread); 48 | 49 | // 回调 50 | if (typeof callback === 'function') callback(i); 51 | } 52 | } 53 | 54 | /** 55 | * 获得该画师需要下载的画作列表 56 | * 57 | * @param {Illustrator} illustrator 58 | * @returns 59 | */ 60 | async function getDownloadListByIllustrator(illustrator) { 61 | let illusts = []; 62 | 63 | // 得到画师下载目录 64 | const dir = await illustrator.info().then(getIllustratorNewDir); 65 | const dldir = Path.join(config.path, dir); 66 | const ugoiraDir = new UgoiraDir(dldir); 67 | const illustExists = file => (file.endsWith('.zip') ? ugoiraDir.existsSync(file) : Fse.existsSync(Path.join(dldir, file))); 68 | 69 | // 最新画作检查 70 | const exampleIllusts = illustrator.exampleIllusts; 71 | if (exampleIllusts) { 72 | let existNum = 0; 73 | for (const ei of exampleIllusts) { 74 | if (illustExists(ei.file)) existNum++; 75 | else illusts.push(ei); 76 | } 77 | if (existNum > 0) { 78 | return { 79 | dir, 80 | illusts: illusts.reverse(), 81 | }; 82 | } 83 | } 84 | 85 | // 得到未下载的画作 86 | illusts = []; 87 | 88 | const processDisplay = Tools.showProgress(() => illusts.length); 89 | 90 | let cnt; 91 | do { 92 | cnt = 0; 93 | const temps = await illustrator.illusts(); 94 | for (const temp of temps) { 95 | if (!illustExists(temp.file)) { 96 | illusts.push(temp); 97 | cnt++; 98 | } 99 | } 100 | } while (illustrator.hasNext('illust') && cnt > 0); 101 | 102 | Tools.clearProgress(processDisplay); 103 | 104 | return { 105 | dir, 106 | illusts: illusts.reverse(), 107 | }; 108 | } 109 | 110 | /** 111 | * 下载自己的收藏 112 | * 113 | * @param {Illustrator} me 自己 114 | * @param {boolean} [isPrivate=false] 是否是私密 115 | * @returns 116 | */ 117 | async function downloadByBookmark(me, isPrivate = false) { 118 | // 得到画师下载目录 119 | const dir = '[bookmark] ' + (isPrivate ? 'Private' : 'Public'); 120 | const dldir = Path.join(config.path, dir); 121 | const ugoiraDir = new UgoiraDir(dldir); 122 | const illustExists = file => (file.endsWith('.zip') ? ugoiraDir.existsSync(file) : Fse.existsSync(Path.join(dldir, file))); 123 | 124 | console.log('\nCollecting illusts of your bookmark'); 125 | 126 | // 得到未下载的画作 127 | const illusts = []; 128 | 129 | const processDisplay = Tools.showProgress(() => illusts.length); 130 | 131 | let cnt; 132 | do { 133 | cnt = 0; 134 | const temps = await me.bookmarks(isPrivate); 135 | for (const temp of temps) { 136 | if (!illustExists(temp.file)) { 137 | illusts.push(temp); 138 | cnt++; 139 | } 140 | } 141 | } while (me.hasNext('bookmark') && cnt > 0); 142 | 143 | Tools.clearProgress(processDisplay); 144 | 145 | // 下载 146 | await downloadIllusts(illusts.reverse(), Path.join(dldir), config.thread); 147 | } 148 | 149 | /** 150 | * 多线程下载插画队列 151 | * 152 | * @param {Array} illusts 插画队列 153 | * @param {string} dldir 下载目录 154 | * @param {number} totalThread 下载线程 155 | * @returns 成功下载的画作数 156 | */ 157 | function downloadIllusts(illusts, dldir, totalThread) { 158 | const tempDir = config.tmp; 159 | let totalI = 0; 160 | 161 | // 清除残留的临时文件 162 | if (Fse.existsSync(tempDir)) Fse.removeSync(tempDir); 163 | 164 | // 开始多线程下载 165 | let errorThread = 0; 166 | let pause = false; 167 | const hangup = 5 * 60 * 1000; 168 | let errorTimeout = null; 169 | 170 | // 单个线程 171 | function singleThread(threadID) { 172 | return new Promise(async resolve => { 173 | while (true) { 174 | const i = totalI++; 175 | // 线程终止 176 | if (i >= illusts.length) return resolve(threadID); 177 | 178 | const illust = illusts[i]; 179 | 180 | const options = { 181 | headers: { 182 | referer: pixivRefer, 183 | }, 184 | timeout: 1000 * config.timeout, 185 | }; 186 | // 代理 187 | if (httpsAgent) options.httpsAgent = httpsAgent; 188 | 189 | // 开始下载 190 | console.log(` [${threadID}]\t${(parseInt(i) + 1).toString().green}/${illusts.length}\t ${'pid'.gray} ${illust.id.toString().cyan}\t${illust.title.yellow}`); 191 | await (async function tryDownload(times) { 192 | if (times > 10) { 193 | if (errorThread > 1) { 194 | if (errorTimeout) clearTimeout(errorTimeout); 195 | errorTimeout = setTimeout(() => { 196 | console.log('\n' + 'Network error! Pause 5 minutes.'.red + '\n'); 197 | }, 1000); 198 | pause = true; 199 | } else return; 200 | } 201 | if (pause) { 202 | times = 1; 203 | await sleep(hangup); 204 | pause = false; 205 | } 206 | // 失败重试 207 | return Tools.download(tempDir, illust.file, illust.url, options) 208 | .then(async res => { 209 | // 文件完整性校验 210 | const fileSize = res.headers['content-length']; 211 | const dlFile = Path.join(tempDir, illust.file); 212 | // 针对Linux文件系统不明bug 213 | await sleep(1000); 214 | for (let i = 0; i < 15 && !Fse.existsSync(dlFile); i++) await sleep(200); 215 | const dlFileSize = Fse.statSync(dlFile).size; 216 | if (!fileSize || dlFileSize == fileSize) Fse.moveSync(dlFile, Path.join(dldir, illust.file)); 217 | else { 218 | Fse.unlinkSync(dlFile); 219 | throw new Error(`Incomplete download ${dlFileSize}/${fileSize}`); 220 | } 221 | if (times != 1) errorThread--; 222 | }) 223 | .catch(e => { 224 | if (e && e.response && e.response.status == 404) { 225 | console.log(' ' + '404'.bgRed + `\t${(parseInt(i) + 1).toString().green}/${illusts.length}\t ${'pid'.gray} ${illust.id.toString().cyan}\t${illust.title.yellow}`); 226 | return; 227 | } else if (times == 1) errorThread++; 228 | if (global.p_debug) console.log(e); 229 | console.log( 230 | ` ${times >= 10 ? `[${threadID}]`.bgRed : `[${threadID}]`.bgYellow}\t${(parseInt(i) + 1).toString().green}/${illusts.length}\t ${'pid'.gray} ${illust.id.toString().cyan}\t${ 231 | illust.title.yellow 232 | }` 233 | ); 234 | return tryDownload(times + 1); 235 | }); 236 | })(1); 237 | } 238 | }); 239 | } 240 | 241 | const threads = []; 242 | 243 | // 开始多线程 244 | for (let t = 0; t < totalThread; t++) 245 | threads.push( 246 | singleThread(t).catch(e => { 247 | if (global.p_debug) console.log(e); 248 | }) 249 | ); 250 | 251 | return Promise.all(threads); 252 | } 253 | 254 | /** 255 | * 得到某个画师对应的下载目录名 256 | * 257 | * @param {*} data 画师资料 258 | * @returns 下载目录名 259 | */ 260 | async function getIllustratorNewDir(data) { 261 | // 下载目录 262 | const mainDir = config.path; 263 | let dldir = null; 264 | 265 | // 先搜寻已有目录 266 | Fse.ensureDirSync(mainDir); 267 | const files = Fse.readdirSync(mainDir); 268 | for (const file of files) { 269 | if (file.indexOf('(' + data.id + ')') === 0) { 270 | dldir = file; 271 | break; 272 | } 273 | } 274 | 275 | // 去除画师名常带的摊位后缀,以及非法字符 276 | let iName = data.name; 277 | const nameExtIndex = iName.search(/@|@/); 278 | if (nameExtIndex >= 1) iName = iName.substring(0, nameExtIndex); 279 | iName = iName.replace(/[/\\:*?"<>|.&$]/g, '').replace(/[ ]+$/, ''); 280 | const dldirNew = '(' + data.id + ')' + iName; 281 | 282 | // 决定下载目录 283 | if (!dldir) { 284 | dldir = dldirNew; 285 | } else if (config.autoRename && dldir.toLowerCase() != dldirNew.toLowerCase()) { 286 | try { 287 | Fse.renameSync(Path.join(mainDir, dldir), Path.join(mainDir, dldirNew)); 288 | dldir = dldirNew; 289 | console.log('\nDirectory renamed: %s => %s', dldir.yellow, dldirNew.green); 290 | } catch (error) { 291 | console.log('\nDirectory rename failed: %s => %s', dldir.yellow, dldirNew.red); 292 | console.error(error); 293 | } 294 | } 295 | 296 | return dldir; 297 | } 298 | 299 | /** 300 | * 根据PID下载 301 | * @method downloadByIllusts 302 | * @param {Array} illustJSON 由API得到的画作JSON 303 | */ 304 | async function downloadByIllusts(illustJSON) { 305 | console.log(); 306 | let illusts = []; 307 | for (const json of illustJSON) { 308 | illusts = illusts.concat(await Illust.getIllusts(json)); 309 | } 310 | await downloadIllusts(illusts, Path.join(config.path, 'PID'), config.thread); 311 | } 312 | 313 | function sleep(ms) { 314 | return new Promise(resolve => { 315 | setTimeout(resolve, ms); 316 | }); 317 | } 318 | 319 | module.exports = { 320 | setConfig, 321 | setAgent, 322 | downloadByIllusts, 323 | downloadByIllustrators, 324 | downloadByBookmark, 325 | }; 326 | -------------------------------------------------------------------------------- /src/illust.js: -------------------------------------------------------------------------------- 1 | let pixiv; 2 | 3 | /** 4 | * 插画 5 | * 6 | * @class Illust 7 | */ 8 | class Illust { 9 | /** 10 | *Creates an instance of Illust. 11 | * @param {number} id PID 12 | * @param {string} title 作品名 13 | * @param {string} url 原画链接 14 | * @param {string} file 文件名 15 | * @memberof Illust 16 | */ 17 | constructor(id, title, url, file) { 18 | this.id = id; 19 | this.title = title; 20 | this.url = url; 21 | this.file = file; 22 | } 23 | 24 | static setPixiv(p) { 25 | pixiv = p; 26 | } 27 | 28 | getObject() { 29 | return { 30 | id: this.id, 31 | title: this.title, 32 | url: this.url, 33 | file: this.file, 34 | }; 35 | } 36 | 37 | /** 38 | * 从插画JSON对象中得到插画列表 39 | * 40 | * @param {*} illustJSON 插画JSON对象 41 | * @returns 插画列表 42 | */ 43 | static async getIllusts(illustJSON) { 44 | const illusts = []; 45 | // 得到插画信息 46 | const title = illustJSON.title.replace(/[\x00-\x1F\x7F]/g, ''); 47 | const fileName = title.replace(/[/\\:*?"<>|.&$]/g, ''); // 适合的文件名 48 | const id = illustJSON.id; 49 | // 动图的话是一个压缩包 50 | if (illustJSON.type == 'ugoira') { 51 | const ugoiraParams = [id, title, illustJSON.meta_single_page.original_image_url.replace('img-original', 'img-zip-ugoira').replace(/_ugoira0\.(.*)/, '_ugoira1920x1080.zip')]; 52 | if (global.ugoiraMeta) { 53 | try { 54 | const uDelay = await pixiv.ugoiraMetaData(id).then(ret => ret.ugoira_metadata.frames[0].delay); 55 | illusts.push(new Illust(...ugoiraParams, `(${id})${fileName}@${uDelay}ms.zip`)); 56 | } catch (error) { 57 | console.error('\nFailed to get ugoira meta data . If you get a rate limit error, please use ', '--no-ugoira-meta'.yellow, 'argument to avoid it.', error, '\n'); 58 | illusts.push(new Illust(...ugoiraParams, `(${id})${fileName}.zip`)); 59 | } 60 | } else illusts.push(new Illust(...ugoiraParams, `(${id})${fileName}.zip`)); 61 | } else { 62 | if (illustJSON.meta_pages.length > 0) { 63 | // 组图 64 | for (const pi in illustJSON.meta_pages) { 65 | const url = illustJSON.meta_pages[pi].image_urls.original; 66 | const ext = url.substr(url.lastIndexOf('.')); // 图片扩展名 67 | illusts.push(new Illust(id, title + '_p' + pi, url, `(${id})${fileName}_p${pi}${ext}`)); 68 | } 69 | } else if (illustJSON.meta_single_page.original_image_url) { 70 | const url = illustJSON.meta_single_page.original_image_url; 71 | const ext = url.substr(url.lastIndexOf('.')); // 图片扩展名 72 | // 单图 73 | illusts.push(new Illust(id, title, url, `(${id})${fileName}${ext}`)); 74 | } 75 | } 76 | // 结果 77 | return illusts; 78 | } 79 | } 80 | 81 | module.exports = Illust; 82 | -------------------------------------------------------------------------------- /src/illustrator.js: -------------------------------------------------------------------------------- 1 | const Illust = require('./illust'); 2 | 3 | let pixiv; 4 | 5 | /** 6 | * 画师 7 | * 8 | * @class Illustrator 9 | */ 10 | class Illustrator { 11 | /** 12 | *Creates an instance of Illustrator. 13 | * @param {*} uid 画师UID 14 | * @param {string} [uname=''] 画师名字 15 | * @memberof Illustrator 16 | */ 17 | constructor(uid, uname = '') { 18 | this.id = uid; 19 | this.name = uname; 20 | this.next = { 21 | illust: null, 22 | bookmark: null, 23 | }; 24 | } 25 | 26 | async setExampleIllusts(illustsJSON) { 27 | this.exampleIllusts = []; 28 | for (const illustJSON of illustsJSON) { 29 | this.exampleIllusts = this.exampleIllusts.concat(await Illust.getIllusts(illustJSON)); 30 | } 31 | } 32 | 33 | static setPixiv(p) { 34 | pixiv = p; 35 | } 36 | 37 | /** 38 | * 获取画师信息 39 | * 40 | * @returns 画师信息 41 | * @memberof Illustrator 42 | */ 43 | async info() { 44 | let userData; 45 | if (this.name.length > 0) { 46 | userData = { 47 | id: this.id, 48 | name: this.name, 49 | }; 50 | } else { 51 | userData = await pixiv.userDetail(this.id).then(ret => ret.user); 52 | this.name = userData.name; 53 | } 54 | return userData; 55 | } 56 | 57 | /** 58 | * 按类型获取插画 59 | * 60 | * @param {string} type 类型 61 | * @param {*} [option=null] 选项 62 | * @returns 插画列表 63 | * @memberof Illustrator 64 | */ 65 | async getSomeIllusts(type, option = null) { 66 | let result = []; 67 | let json = {}; 68 | 69 | // 请求 70 | if (this.next[type]) json = await pixiv.requestUrl(this.next[type]); 71 | else { 72 | if (type == 'illust') json = await pixiv.userIllusts(this.id); 73 | else if (type == 'bookmark') { 74 | if (option) json = await pixiv.userBookmarksIllust(this.id, option); 75 | else json = await pixiv.userBookmarksIllust(this.id); 76 | } 77 | } 78 | 79 | // 数据整合 80 | for (const illust of json.illusts) { 81 | result = result.concat(await Illust.getIllusts(illust)); 82 | } 83 | 84 | this.next[type] = json.next_url; 85 | 86 | return result; 87 | } 88 | 89 | /** 90 | * 得到用户的插画(一次30张) 91 | * 92 | * @returns 93 | * @memberof Illustrator 94 | */ 95 | illusts() { 96 | return this.getSomeIllusts('illust'); 97 | } 98 | 99 | /** 100 | * 得到用户的收藏(一次30张) 101 | * 102 | * @param {boolean} [isPrivate=false] 是否是私密 103 | * @returns 104 | * @memberof Illustrator 105 | */ 106 | bookmarks(isPrivate = false) { 107 | return this.getSomeIllusts('bookmark', { 108 | restrict: isPrivate ? 'private' : 'public', 109 | }); 110 | } 111 | 112 | /** 113 | * 是否还有 114 | * 115 | * @returns 116 | * @memberof Illustrator 117 | */ 118 | hasNext(nextName) { 119 | return !!this.next[nextName]; 120 | } 121 | } 122 | 123 | module.exports = Illustrator; 124 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | require('colors'); 2 | const PixivApi = require('./pixiv-api-client-mod'); 3 | const Downloader = require('./downloader'); 4 | const Illust = require('./illust'); 5 | const Illustrator = require('./illustrator'); 6 | const Fse = require('fs-extra'); 7 | const Path = require('path'); 8 | const Tools = require('./tools'); 9 | const { getProxyAgent, delSysProxy } = require('./proxy'); 10 | const { Agent } = require('https'); 11 | 12 | const CONFIG_FILE_DIR = require('appdata-path').getAppDataPath('pxder'); 13 | const CONFIG_FILE = Path.resolve(CONFIG_FILE_DIR, 'config.json'); 14 | 15 | const defaultConfig = { 16 | download: { 17 | thread: 5, 18 | timeout: 30, 19 | }, 20 | }; 21 | Object.freeze(defaultConfig); 22 | 23 | let __config; 24 | 25 | class PixivFunc { 26 | constructor() { 27 | this.followNextUrl = null; 28 | } 29 | 30 | /** 31 | * 初始化配置文件 32 | * 33 | * @static 34 | * @param {boolean} [forceInit=false] 是否强制初始化 35 | * @memberof PixivFunc 36 | */ 37 | static initConfig(forceInit = false) { 38 | Fse.ensureDirSync(CONFIG_FILE_DIR); 39 | if (!Fse.existsSync(CONFIG_FILE) || forceInit) Fse.writeJSONSync(CONFIG_FILE, defaultConfig); 40 | } 41 | 42 | /** 43 | * 读取配置 44 | * 45 | * @static 46 | * @returns 配置 47 | * @memberof PixivFunc 48 | */ 49 | static readConfig() { 50 | PixivFunc.initConfig(); 51 | const config = (() => { 52 | try { 53 | return Fse.readJsonSync(CONFIG_FILE); 54 | } catch (error) {} 55 | return defaultConfig; 56 | })(); 57 | // check 58 | Object.keys(defaultConfig.download).forEach(key => { 59 | if (typeof config.download[key] === 'undefined') config.download[key] = defaultConfig.download[key]; 60 | }); 61 | return config; 62 | } 63 | 64 | /** 65 | * 写入配置 66 | * 67 | * @static 68 | * @param {*} config 配置 69 | * @memberof PixivFunc 70 | */ 71 | static writeConfig(config) { 72 | Fse.ensureDirSync(CONFIG_FILE_DIR); 73 | Fse.writeJsonSync(CONFIG_FILE, config); 74 | } 75 | 76 | /** 77 | * 检查配置 78 | * 79 | * @static 80 | * @param {*} [config=PixivFunc.readConfig()] 81 | * @returns 是否通过 82 | * @memberof PixivFunc 83 | */ 84 | static checkConfig(config = PixivFunc.readConfig()) { 85 | let check = true; 86 | if (!config.refresh_token) { 87 | console.error('\nYou must login first!'.red + '\n Try ' + 'pxder --login'.yellow); 88 | check = false; 89 | } 90 | if (!config.download.path) { 91 | check = false; 92 | console.error('\nYou must set download path first!'.red + '\n Try ' + 'pxder --setting'.yellow); 93 | } 94 | return check; 95 | } 96 | 97 | /** 98 | * 应用配置 99 | * 100 | * @static 101 | * @param {*} config 配置 102 | * @memberof PixivFunc 103 | */ 104 | static applyConfig(config = PixivFunc.readConfig()) { 105 | __config = config; 106 | config.download.tmp = Path.join(CONFIG_FILE_DIR, 'tmp'); 107 | Downloader.setConfig(config.download); 108 | PixivFunc.applyProxyConfig(config); 109 | } 110 | 111 | /** 112 | * 应用代理配置 113 | * 114 | * @static 115 | * @param {*} config 配置 116 | * @memberof PixivFunc 117 | */ 118 | static applyProxyConfig(config = PixivFunc.readConfig()) { 119 | const agent = getProxyAgent(config.proxy); 120 | // fix OAuth may fail 121 | delSysProxy(); 122 | if (agent) { 123 | Downloader.setAgent(agent); 124 | PixivApi.setAgent(agent); 125 | global.proxyAgent = agent; 126 | } 127 | } 128 | 129 | /** 130 | * 登录 131 | * 132 | * @static 133 | * @param {string} code 134 | * @param {string} code_verifier 135 | * @memberof PixivFunc 136 | */ 137 | static async login(code, code_verifier) { 138 | // 登录 139 | const pixiv = new PixivApi(); 140 | await pixiv.tokenRequest(code, code_verifier); 141 | // 获取 refresh_token 142 | const refresh_token = pixiv.authInfo().refresh_token; 143 | // 更新配置 144 | const conf = PixivFunc.readConfig(); 145 | conf.refresh_token = refresh_token; 146 | PixivFunc.writeConfig(conf); 147 | } 148 | 149 | /** 150 | * 使用 refreshToken 登录 151 | * 152 | * @static 153 | * @param {string} token refreshToken 154 | * @memberof PixivFunc 155 | */ 156 | static async loginByToken(token) { 157 | // 测试登录 158 | const pixiv = new PixivApi(); 159 | await pixiv.refreshAccessToken(token); 160 | // 更新配置 161 | const conf = PixivFunc.readConfig(); 162 | conf.refresh_token = token; 163 | PixivFunc.writeConfig(conf); 164 | } 165 | 166 | /** 167 | * 重登陆 168 | * 169 | * @static 170 | * @returns 成功或失败 171 | * @memberof PixivFunc 172 | */ 173 | async relogin() { 174 | // 检查配置 175 | const refresh_token = PixivFunc.readConfig().refresh_token; 176 | if (!refresh_token) return false; 177 | // 刷新 token 178 | this.pixiv = new PixivApi(); 179 | await this.pixiv.refreshAccessToken(refresh_token); 180 | Illustrator.setPixiv(this.pixiv); 181 | Illust.setPixiv(this.pixiv); 182 | // 定时刷新 token 183 | const p = this.pixiv; 184 | this.reloginInterval = setInterval(() => { 185 | p.refreshAccessToken(refresh_token); 186 | }, 40 * 60 * 1000); 187 | return true; 188 | } 189 | 190 | /** 191 | * 清除定时重登陆 192 | * 193 | * @memberof PixivFunc 194 | */ 195 | clearReloginInterval() { 196 | clearInterval(this.reloginInterval); 197 | } 198 | 199 | /** 200 | * 登出 201 | * 202 | * @static 203 | * @memberof PixivFunc 204 | */ 205 | static logout() { 206 | const config = PixivFunc.readConfig(); 207 | config.refresh_token = null; 208 | PixivFunc.writeConfig(config); 209 | } 210 | 211 | /** 212 | * 取得我的关注(一次30个) 213 | * 214 | * @param {boolean} [isPrivate=false] 是否是私密关注 215 | * @returns 关注列表 216 | * @memberof PixivFunc 217 | */ 218 | async getMyFollow(isPrivate = false) { 219 | const follows = []; 220 | let next = this.followNextUrl; 221 | 222 | // 加入画师信息 223 | async function addToFollows(data) { 224 | next = data.next_url; 225 | for (const preview of data.user_previews) { 226 | if (preview.user.id != 11) { 227 | // 除去“pixiv事務局” 228 | const tmp = new Illustrator(preview.user.id, preview.user.name); 229 | await tmp.setExampleIllusts(preview.illusts); 230 | follows.push(tmp); 231 | } 232 | } 233 | } 234 | 235 | // 开始收集 236 | if (next) { 237 | await this.pixiv.requestUrl(next).then(addToFollows); 238 | } else 239 | await this.pixiv 240 | .userFollowing(this.pixiv.authInfo().user.id, { 241 | restrict: isPrivate ? 'private' : 'public', 242 | }) 243 | .then(addToFollows); 244 | 245 | this.followNextUrl = next; 246 | return follows; 247 | } 248 | 249 | /** 250 | * 是否还有关注画师可以取得 251 | * 252 | * @returns 是或否 253 | * @memberof PixivFunc 254 | */ 255 | hasNextMyFollow() { 256 | return !!this.followNextUrl; 257 | } 258 | 259 | /** 260 | * 取得我的所有关注 261 | * 262 | * @param {boolean} [isPrivate=false] 是否是私密关注 263 | * @returns 关注列表 264 | * @memberof PixivFunc 265 | */ 266 | async getAllMyFollow(isPrivate = false) { 267 | const follows = []; 268 | 269 | const processDisplay = Tools.showProgress(() => follows.length); 270 | 271 | do { 272 | follows.push(...(await this.getMyFollow(isPrivate))); 273 | } while (this.followNextUrl); 274 | 275 | Tools.clearProgress(processDisplay); 276 | 277 | return follows; 278 | } 279 | 280 | /** 281 | * 根据UID下载插画 282 | * 283 | * @param {*} uids 画师UID(可数组) 284 | * @memberof PixivFunc 285 | */ 286 | async downloadByUIDs(uids) { 287 | const uidArray = Array.isArray(uids) ? uids : [uids]; 288 | for (const uid of uidArray) { 289 | await Downloader.downloadByIllustrators([new Illustrator(uid)]).catch(Tools.logError); 290 | } 291 | } 292 | 293 | /** 294 | * 根据收藏下载插画 295 | * 296 | * @param {boolean} [isPrivate=false] 是否私密 297 | * @memberof PixivFunc 298 | */ 299 | async downloadBookmark(isPrivate = false) { 300 | const me = new Illustrator(this.pixiv.authInfo().user.id); 301 | await Downloader.downloadByBookmark(me, isPrivate); 302 | } 303 | 304 | /** 305 | * 下载关注画师的所有插画 306 | * 307 | * @param {boolean} isPrivate 是否是私密关注 308 | * @param {boolean} force 是否忽略上次进度 309 | * @memberof PixivFunc 310 | */ 311 | async downloadFollowAll(isPrivate, force) { 312 | let follows = null; 313 | let illustrators = null; 314 | 315 | // 临时文件 316 | const tmpJson = Path.join(CONFIG_FILE_DIR, (isPrivate ? 'private' : 'public') + '.json'); 317 | const tmpJsonExist = Fse.existsSync(tmpJson); 318 | Fse.ensureDirSync(__config.download.path); 319 | 320 | // 取得关注列表 321 | if (!tmpJsonExist || force || (tmpJsonExist && !(follows = Tools.readJsonSafely(tmpJson, null)))) { 322 | console.log('\nCollecting your follows'); 323 | follows = []; 324 | await this.getAllMyFollow(isPrivate).then(ret => { 325 | illustrators = ret; 326 | ret.forEach(illustrator => 327 | follows.push({ 328 | id: illustrator.id, 329 | name: illustrator.name, 330 | illusts: illustrator.exampleIllusts, 331 | }) 332 | ); 333 | }); 334 | Fse.ensureDirSync(CONFIG_FILE_DIR); 335 | Fse.writeJSONSync(tmpJson, follows); 336 | } 337 | 338 | // 数据恢复 339 | if (!illustrators) { 340 | illustrators = []; 341 | for (const follow of follows) { 342 | const tempI = new Illustrator(follow.id, follow.name); 343 | tempI.exampleIllusts = follow.illusts; 344 | illustrators.push(tempI); 345 | } 346 | } 347 | 348 | // 开始下载 349 | await Downloader.downloadByIllustrators(illustrators, () => { 350 | follows.shift(); 351 | Fse.ensureDirSync(CONFIG_FILE_DIR); 352 | Fse.writeJSONSync(tmpJson, follows); 353 | }); 354 | 355 | // 清除临时文件 356 | Fse.unlinkSync(tmpJson); 357 | } 358 | 359 | /** 360 | * 对下载目录内的所有画师更新画作 361 | * 362 | * @memberof PixivFunc 363 | */ 364 | async downloadUpdate() { 365 | const uids = []; 366 | // 得到文件夹内所有UID 367 | Fse.ensureDirSync(__config.download.path); 368 | const files = Fse.readdirSync(__config.download.path); 369 | for (const file of files) { 370 | const search = /^\(([0-9]+)\)/.exec(file); 371 | if (search) uids.push(search[1]); 372 | } 373 | // 下载 374 | const illustrators = []; 375 | uids.forEach(uid => illustrators.push(new Illustrator(uid))); 376 | await Downloader.downloadByIllustrators(illustrators); 377 | } 378 | 379 | /** 380 | * 获取工具 381 | * 382 | * @static 383 | * @returns 工具 384 | * @memberof PixivFunc 385 | */ 386 | static tools() { 387 | return require('./tools'); 388 | } 389 | 390 | /** 391 | * 根据PID下载插画 392 | * @param {Array} pids 作品PID 393 | * @memberof PixivFunc 394 | */ 395 | async downloadByPIDs(pids) { 396 | const jsons = []; 397 | const dirPath = Path.join(__config.download.path, 'PID'); 398 | Fse.ensureDirSync(dirPath); 399 | const exists = Fse.readdirSync(dirPath) 400 | .map(file => { 401 | const search = /^\(([0-9]+)\)/.exec(file); 402 | if (search && search[1]) return search[1]; 403 | return null; 404 | }) 405 | .filter(pid => pid); 406 | for (const pid of pids) { 407 | if (exists.includes(pid)) continue; 408 | try { 409 | jsons.push(await this.pixiv.illustDetail(pid).then(json => json.illust)); 410 | } catch (error) { 411 | console.log(`${pid} does not exist`.gray); 412 | } 413 | } 414 | await Downloader.downloadByIllusts(jsons); 415 | } 416 | } 417 | 418 | module.exports = PixivFunc; 419 | -------------------------------------------------------------------------------- /src/logError.js: -------------------------------------------------------------------------------- 1 | module.exports = e => { 2 | if (typeof e === 'object') { 3 | if (e.stack) { 4 | console.error(e.stack); 5 | delete e.stack; 6 | } 7 | console.error('ERROR'.red, JSON.stringify(e, Object.getOwnPropertyNames(e), 4)); 8 | } else console.error('ERROR'.red, e); 9 | }; 10 | -------------------------------------------------------------------------------- /src/pixiv-api-client-mod.js: -------------------------------------------------------------------------------- 1 | /* 2 | https://github.com/alphasp/pixiv-api-client 3 | 4 | MIT License 5 | 6 | Copyright (c) 2016 alphasp 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | */ 26 | 27 | require('colors'); // mod 28 | 29 | let axios = require('axios'); // mod 30 | const qs = require('qs'); 31 | const md5 = require('blueimp-md5'); 32 | const Readline = require('readline'); 33 | const moment = require('moment'); 34 | const logError = require('./logError'); 35 | 36 | const BASE_URL = 'https://app-api.pixiv.net'; 37 | const CLIENT_ID = 'MOBrBDS8blbauoSck0ZfDbtuzpyT'; 38 | const CLIENT_SECRET = 'lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj'; 39 | const HASH_SECRET = '28c1fdd170a5204386cb1313c7077b34f83e4aaf4aa829ce78c231e05b0bae2c'; 40 | 41 | const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); 42 | 43 | function callApi(url, options, retry = 2) { 44 | const finalUrl = /^https?:\/\//i.test(url) ? url : BASE_URL + url; 45 | return axios(finalUrl, options) 46 | .then(res => res.data) 47 | .catch(async err => { 48 | // mod 49 | if (global.p_debug) { 50 | console.error(finalUrl); 51 | logError(err); 52 | } 53 | if (err.code == 'ECONNRESET') { 54 | Readline.clearLine(process.stdout, 0); 55 | Readline.cursorTo(process.stdout, 0); 56 | console.error('Connection reset detected.'.gray); 57 | await sleep(3 * 1000); 58 | return callApi(url, options); 59 | } else if (err.response && err.response.data) { 60 | const msg = JSON.stringify(err.response.data); 61 | if (/rate limit/i.test(msg)) { 62 | console.error('Rate limit detected. Pause for 10 minutes.'.gray); 63 | await sleep(10 * 60 * 1000); 64 | return callApi(url, options); 65 | } else throw msg; 66 | } else { 67 | if (retry <= 0) throw err.message; 68 | console.error('RETRY'.yellow, url); 69 | console.error(err.message); 70 | await sleep(1000); 71 | return callApi(url, options, retry - 1); 72 | } 73 | }); 74 | } 75 | 76 | class PixivApi { 77 | constructor() { 78 | this.headers = { 79 | 'App-OS': 'android', 80 | 'Accept-Language': 'en-us', 81 | 'App-OS-Version': '9.0', 82 | 'App-Version': '5.0.234', 83 | 'User-Agent': 'PixivAndroidApp/5.0.234 (Android 9.0; Pixel 3)', 84 | }; 85 | } 86 | 87 | // mod 88 | static setAgent(agent) { 89 | axios = require('axios').create({ 90 | httpsAgent: agent, 91 | }); 92 | } 93 | 94 | getDefaultHeaders() { 95 | const datetime = moment().format(); 96 | return Object.assign({}, this.headers, { 97 | 'X-Client-Time': datetime, 98 | 'X-Client-Hash': md5(`${datetime}${HASH_SECRET}`), 99 | }); 100 | } 101 | 102 | tokenRequest(code, code_verifier) { 103 | const data = qs.stringify({ 104 | client_id: CLIENT_ID, 105 | client_secret: CLIENT_SECRET, 106 | code, 107 | code_verifier, 108 | redirect_uri: `${BASE_URL}/web/v1/users/auth/pixiv/callback`, 109 | grant_type: 'authorization_code', 110 | include_policy: true, 111 | }); 112 | const options = { 113 | method: 'POST', 114 | headers: Object.assign(this.getDefaultHeaders(), { 115 | 'Content-Type': 'application/x-www-form-urlencoded', 116 | }), 117 | data, 118 | }; 119 | return callApi('https://oauth.secure.pixiv.net/auth/token', options) 120 | .then(data => { 121 | this.auth = data.response; 122 | return data.response; 123 | }) 124 | .catch(err => { 125 | if (err.response) { 126 | throw err.response.data; 127 | } else { 128 | throw err.message; 129 | } 130 | }); 131 | } 132 | 133 | logout() { 134 | this.auth = null; 135 | this.username = null; 136 | this.password = null; 137 | delete this.headers.Authorization; 138 | return Promise.resolve(); 139 | } 140 | 141 | authInfo() { 142 | return this.auth; 143 | } 144 | 145 | refreshAccessToken(refreshToken) { 146 | if ((!this.auth || !this.auth.refresh_token) && !refreshToken) { 147 | return Promise.reject(new Error('refresh_token required')); 148 | } 149 | const data = qs.stringify({ 150 | client_id: CLIENT_ID, 151 | client_secret: CLIENT_SECRET, 152 | get_secure_url: true, 153 | include_policy: true, 154 | grant_type: 'refresh_token', 155 | refresh_token: refreshToken || this.auth.refresh_token, 156 | }); 157 | const options = { 158 | method: 'POST', 159 | headers: Object.assign(this.getDefaultHeaders(), { 160 | 'Content-Type': 'application/x-www-form-urlencoded', 161 | }), 162 | data, 163 | }; 164 | return callApi('https://oauth.secure.pixiv.net/auth/token', options).then(data => { 165 | this.auth = data.response; 166 | return data.response; 167 | }); 168 | } 169 | 170 | // require auth 171 | userState() { 172 | return this.requestUrl('/v1/user/me/state'); 173 | } 174 | 175 | searchIllust(word, options) { 176 | if (!word) { 177 | return Promise.reject(new Error('word required')); 178 | } 179 | 180 | const queryString = qs.stringify( 181 | Object.assign( 182 | { 183 | word, 184 | search_target: 'partial_match_for_tags', 185 | sort: 'date_desc', 186 | }, 187 | options 188 | ) 189 | ); 190 | return this.requestUrl(`/v1/search/illust?${queryString}`); 191 | } 192 | 193 | searchIllustPopularPreview(word, options) { 194 | if (!word) { 195 | return Promise.reject(new Error('word required')); 196 | } 197 | 198 | const queryString = qs.stringify( 199 | Object.assign( 200 | { 201 | word, 202 | search_target: 'partial_match_for_tags', 203 | }, 204 | options 205 | ) 206 | ); 207 | return this.requestUrl(`/v1/search/popular-preview/illust?${queryString}`); 208 | } 209 | 210 | searchNovel(word, options) { 211 | if (!word) { 212 | return Promise.reject(new Error('word required')); 213 | } 214 | 215 | const queryString = qs.stringify( 216 | Object.assign( 217 | { 218 | word, 219 | search_target: 'partial_match_for_tags', 220 | sort: 'date_desc', 221 | }, 222 | options 223 | ) 224 | ); 225 | return this.requestUrl(`/v1/search/novel?${queryString}`); 226 | } 227 | 228 | searchNovelPopularPreview(word, options) { 229 | if (!word) { 230 | return Promise.reject(new Error('word required')); 231 | } 232 | 233 | const queryString = qs.stringify( 234 | Object.assign( 235 | { 236 | word, 237 | search_target: 'partial_match_for_tags', 238 | }, 239 | options 240 | ) 241 | ); 242 | return this.requestUrl(`/v1/search/popular-preview/novel?${queryString}`); 243 | } 244 | 245 | searchIllustBookmarkRanges(word, options) { 246 | if (!word) { 247 | return Promise.reject('word required'); 248 | } 249 | const queryString = qs.stringify( 250 | Object.assign( 251 | { 252 | word, 253 | search_target: 'partial_match_for_tags', 254 | }, 255 | options 256 | ) 257 | ); 258 | return this.requestUrl(`/v1/search/bookmark-ranges/illust?${queryString}`); 259 | } 260 | 261 | searchNovelBookmarkRanges(word, options) { 262 | if (!word) { 263 | return Promise.reject('word required'); 264 | } 265 | const queryString = qs.stringify( 266 | Object.assign( 267 | { 268 | word, 269 | search_target: 'partial_match_for_tags', 270 | }, 271 | options 272 | ) 273 | ); 274 | return this.requestUrl(`/v1/search/bookmark-ranges/novel?${queryString}`); 275 | } 276 | 277 | searchUser(word) { 278 | if (!word) { 279 | return Promise.reject(new Error('word required')); 280 | } 281 | const queryString = qs.stringify( 282 | Object.assign({ 283 | word, 284 | }) 285 | ); 286 | return this.requestUrl(`/v1/search/user?${queryString}`); 287 | } 288 | 289 | searchAutoComplete(word) { 290 | if (!word) { 291 | return Promise.reject('word required'); 292 | } 293 | const queryString = qs.stringify( 294 | Object.assign({ 295 | word, 296 | }) 297 | ); 298 | return this.requestUrl(`/v1/search/autocomplete?${queryString}`); 299 | } 300 | 301 | searchAutoCompleteV2(word) { 302 | if (!word) { 303 | return Promise.reject('word required'); 304 | } 305 | const queryString = qs.stringify( 306 | Object.assign({ 307 | word, 308 | }) 309 | ); 310 | return this.requestUrl(`/v2/search/autocomplete?${queryString}`); 311 | } 312 | 313 | userDetail(id, options) { 314 | if (!id) { 315 | return Promise.reject(new Error('user_id required')); 316 | } 317 | 318 | const queryString = qs.stringify( 319 | Object.assign( 320 | { 321 | user_id: id, 322 | }, 323 | options 324 | ) 325 | ); 326 | return this.requestUrl(`/v1/user/detail?${queryString}`); 327 | } 328 | 329 | userIllusts(id, options) { 330 | if (!id) { 331 | return Promise.reject(new Error('user_id required')); 332 | } 333 | 334 | const queryString = qs.stringify( 335 | Object.assign( 336 | { 337 | user_id: id, 338 | }, 339 | options 340 | ) 341 | ); 342 | return this.requestUrl(`/v1/user/illusts?${queryString}`); 343 | } 344 | 345 | userNovels(id, options) { 346 | if (!id) { 347 | return Promise.reject(new Error('user_id required')); 348 | } 349 | 350 | const queryString = qs.stringify( 351 | Object.assign( 352 | { 353 | user_id: id, 354 | }, 355 | options 356 | ) 357 | ); 358 | return this.requestUrl(`/v1/user/novels?${queryString}`); 359 | } 360 | 361 | userBookmarksIllust(id, options) { 362 | if (!id) { 363 | return Promise.reject(new Error('user_id required')); 364 | } 365 | 366 | const queryString = qs.stringify( 367 | Object.assign( 368 | { 369 | user_id: id, 370 | restrict: 'public', 371 | }, 372 | options 373 | ) 374 | ); 375 | return this.requestUrl(`/v1/user/bookmarks/illust?${queryString}`); 376 | } 377 | 378 | userBookmarkIllustTags(options) { 379 | const queryString = qs.stringify( 380 | Object.assign( 381 | { 382 | restrict: 'public', 383 | }, 384 | options 385 | ) 386 | ); 387 | return this.requestUrl(`/v1/user/bookmark-tags/illust?${queryString}`); 388 | } 389 | 390 | illustBookmarkDetail(id, options) { 391 | if (!id) { 392 | return Promise.reject(new Error('illust_id required')); 393 | } 394 | 395 | const queryString = qs.stringify( 396 | Object.assign( 397 | { 398 | illust_id: id, 399 | }, 400 | options 401 | ) 402 | ); 403 | return this.requestUrl(`/v2/illust/bookmark/detail?${queryString}`); 404 | } 405 | 406 | userBookmarksNovel(id, options) { 407 | if (!id) { 408 | return Promise.reject(new Error('user_id required')); 409 | } 410 | 411 | const queryString = qs.stringify( 412 | Object.assign( 413 | { 414 | user_id: id, 415 | restrict: 'public', 416 | }, 417 | options 418 | ) 419 | ); 420 | return this.requestUrl(`/v1/user/bookmarks/novel?${queryString}`); 421 | } 422 | 423 | userBookmarkNovelTags(options) { 424 | const queryString = qs.stringify( 425 | Object.assign( 426 | { 427 | restrict: 'public', 428 | }, 429 | options 430 | ) 431 | ); 432 | return this.requestUrl(`/v1/user/bookmark-tags/novel?${queryString}`); 433 | } 434 | 435 | illustWalkthrough() { 436 | return this.requestUrl('/v1/walkthrough/illusts'); 437 | } 438 | 439 | illustComments(id, options) { 440 | if (!id) { 441 | return Promise.reject(new Error('illust_id required')); 442 | } 443 | 444 | const queryString = qs.stringify( 445 | Object.assign( 446 | { 447 | illust_id: id, 448 | include_total_comments: true, 449 | }, 450 | options 451 | ) 452 | ); 453 | return this.requestUrl(`/v1/illust/comments?${queryString}`); 454 | } 455 | 456 | illustCommentsV2(id, options) { 457 | if (!id) { 458 | return Promise.reject(new Error('illust_id required')); 459 | } 460 | 461 | const queryString = qs.stringify( 462 | Object.assign( 463 | { 464 | illust_id: id, 465 | }, 466 | options 467 | ) 468 | ); 469 | return this.requestUrl(`/v2/illust/comments?${queryString}`); 470 | } 471 | 472 | illustCommentReplies(id) { 473 | if (!id) { 474 | return Promise.reject(new Error('comment_id required')); 475 | } 476 | const queryString = qs.stringify({ comment_id: id }); 477 | return this.requestUrl(`/v1/illust/comment/replies?${queryString}`); 478 | } 479 | 480 | illustRelated(id, options) { 481 | if (!id) { 482 | return Promise.reject(new Error('illust_id required')); 483 | } 484 | 485 | const queryString = qs.stringify( 486 | Object.assign( 487 | { 488 | illust_id: id, 489 | }, 490 | options 491 | ) 492 | ); 493 | return this.requestUrl(`/v2/illust/related?${queryString}`); 494 | } 495 | 496 | illustDetail(id, options) { 497 | if (!id) { 498 | return Promise.reject(new Error('illust_id required')); 499 | } 500 | 501 | const queryString = qs.stringify( 502 | Object.assign( 503 | { 504 | illust_id: id, 505 | }, 506 | options 507 | ) 508 | ); 509 | return this.requestUrl(`/v1/illust/detail?${queryString}`); 510 | } 511 | 512 | illustNew(options) { 513 | const queryString = qs.stringify( 514 | Object.assign( 515 | { 516 | content_type: 'illust', 517 | }, 518 | options 519 | ) 520 | ); 521 | return this.requestUrl(`/v1/illust/new?${queryString}`); 522 | } 523 | 524 | illustFollow(options) { 525 | const queryString = qs.stringify( 526 | Object.assign( 527 | { 528 | restrict: 'all', 529 | }, 530 | options 531 | ) 532 | ); 533 | return this.requestUrl(`/v2/illust/follow?${queryString}`); 534 | } 535 | 536 | illustRecommended(options) { 537 | const queryString = qs.stringify( 538 | Object.assign( 539 | { 540 | include_ranking_illusts: true, 541 | }, 542 | options 543 | ) 544 | ); 545 | return this.requestUrl(`/v1/illust/recommended?${queryString}`); 546 | } 547 | 548 | illustRanking(options) { 549 | const queryString = qs.stringify( 550 | Object.assign( 551 | { 552 | mode: 'day', 553 | }, 554 | options 555 | ) 556 | ); 557 | return this.requestUrl(`/v1/illust/ranking?${queryString}`); 558 | } 559 | 560 | illustMyPixiv() { 561 | return this.requestUrl('/v2/illust/mypixiv'); 562 | } 563 | 564 | illustAddComment(id, comment, parentCommentId) { 565 | if (!id) { 566 | return Promise.reject(new Error('illust_id required')); 567 | } 568 | if (!comment) { 569 | return Promise.reject(new Error('comment required')); 570 | } 571 | const data = qs.stringify({ 572 | illust_id: id, 573 | comment, 574 | parent_comment_id: parentCommentId, 575 | }); 576 | const options = { 577 | method: 'POST', 578 | headers: { 579 | 'Content-Type': 'application/x-www-form-urlencoded', 580 | }, 581 | data, 582 | }; 583 | return this.requestUrl('/v1/illust/comment/add', options); 584 | } 585 | 586 | novelAddComment(id, comment, parentCommentId) { 587 | if (!id) { 588 | return Promise.reject(new Error('novel_id required')); 589 | } 590 | if (!comment) { 591 | return Promise.reject(new Error('comment required')); 592 | } 593 | const data = qs.stringify({ 594 | novel_id: id, 595 | comment, 596 | parent_comment_id: parentCommentId, 597 | }); 598 | const options = { 599 | method: 'POST', 600 | headers: { 601 | 'Content-Type': 'application/x-www-form-urlencoded', 602 | }, 603 | data, 604 | }; 605 | return this.requestUrl('/v1/novel/comment/add', options); 606 | } 607 | 608 | trendingTagsIllust(options) { 609 | const queryString = qs.stringify(Object.assign({}, options)); 610 | return this.requestUrl(`/v1/trending-tags/illust?${queryString}`); 611 | } 612 | 613 | trendingTagsNovel(options) { 614 | const queryString = qs.stringify(Object.assign({}, options)); 615 | return this.requestUrl(`/v1/trending-tags/novel?${queryString}`); 616 | } 617 | 618 | bookmarkIllust(id, restrict, tags) { 619 | if (!id) { 620 | return Promise.reject(new Error('illust_id required')); 621 | } 622 | if (restrict && ['public', 'private'].indexOf(restrict) === -1) { 623 | return Promise.reject(new Error('invalid restrict value')); 624 | } 625 | if (tags && !Array.isArray(tags)) { 626 | return Promise.reject(new Error('invalid tags value')); 627 | } 628 | const data = qs.stringify({ 629 | illust_id: id, 630 | restrict: restrict || 'public', 631 | tags: tags && tags.length ? tags : undefined, 632 | }); 633 | const options = { 634 | method: 'POST', 635 | headers: { 636 | 'Content-Type': 'application/x-www-form-urlencoded', 637 | }, 638 | data, 639 | }; 640 | return this.requestUrl('/v2/illust/bookmark/add', options); 641 | } 642 | 643 | unbookmarkIllust(id) { 644 | if (!id) { 645 | return Promise.reject(new Error('illust_id required')); 646 | } 647 | const data = qs.stringify({ 648 | illust_id: id, 649 | }); 650 | const options = { 651 | method: 'POST', 652 | headers: { 653 | 'Content-Type': 'application/x-www-form-urlencoded', 654 | }, 655 | data, 656 | }; 657 | return this.requestUrl('/v1/illust/bookmark/delete', options); 658 | } 659 | 660 | bookmarkNovel(id, restrict, tags) { 661 | if (!id) { 662 | return Promise.reject(new Error('novel_id required')); 663 | } 664 | if (restrict && ['public', 'private'].indexOf(restrict) === -1) { 665 | return Promise.reject(new Error('invalid restrict value')); 666 | } 667 | if (tags && !Array.isArray(tags)) { 668 | return Promise.reject(new Error('invalid tags value')); 669 | } 670 | const data = qs.stringify({ 671 | novel_id: id, 672 | restrict: restrict || 'public', 673 | tags: tags && tags.length ? tags : undefined, 674 | }); 675 | const options = { 676 | method: 'POST', 677 | headers: { 678 | 'Content-Type': 'application/x-www-form-urlencoded', 679 | }, 680 | data, 681 | }; 682 | return this.requestUrl('/v2/novel/bookmark/add', options); 683 | } 684 | 685 | unbookmarkNovel(id) { 686 | if (!id) { 687 | return Promise.reject(new Error('novel_id required')); 688 | } 689 | const data = qs.stringify({ 690 | novel_id: id, 691 | }); 692 | const options = { 693 | method: 'POST', 694 | headers: { 695 | 'Content-Type': 'application/x-www-form-urlencoded', 696 | }, 697 | data, 698 | }; 699 | return this.requestUrl('/v1/novel/bookmark/delete', options); 700 | } 701 | 702 | followUser(id, restrict) { 703 | if (!id) { 704 | return Promise.reject(new Error('user_id required')); 705 | } 706 | if (restrict && ['public', 'private'].indexOf(restrict) === -1) { 707 | return Promise.reject(new Error('invalid restrict value')); 708 | } 709 | const data = qs.stringify({ 710 | user_id: id, 711 | restrict: restrict || 'public', 712 | }); 713 | const options = { 714 | method: 'POST', 715 | headers: { 716 | 'Content-Type': 'application/x-www-form-urlencoded', 717 | }, 718 | data, 719 | }; 720 | return this.requestUrl('/v1/user/follow/add', options); 721 | } 722 | 723 | unfollowUser(id) { 724 | if (!id) { 725 | return Promise.reject(new Error('user_id required')); 726 | } 727 | const data = qs.stringify({ 728 | user_id: id, 729 | restrict: 'public', 730 | }); 731 | // 732 | const options = { 733 | method: 'POST', 734 | headers: { 735 | 'Content-Type': 'application/x-www-form-urlencoded', 736 | }, 737 | data, 738 | }; 739 | return this.requestUrl('/v1/user/follow/delete', options); 740 | } 741 | 742 | mangaRecommended(options) { 743 | const queryString = qs.stringify( 744 | Object.assign( 745 | { 746 | include_ranking_label: true, 747 | }, 748 | options 749 | ) 750 | ); 751 | return this.requestUrl(`/v1/manga/recommended?${queryString}`); 752 | } 753 | 754 | mangaNew(options) { 755 | const queryString = qs.stringify( 756 | Object.assign( 757 | { 758 | content_type: 'manga', 759 | }, 760 | options 761 | ) 762 | ); 763 | return this.requestUrl(`/v1/illust/new?${queryString}`); 764 | } 765 | 766 | novelRecommended(options) { 767 | const queryString = qs.stringify( 768 | Object.assign( 769 | { 770 | include_ranking_novels: true, 771 | }, 772 | options 773 | ) 774 | ); 775 | return this.requestUrl(`/v1/novel/recommended?${queryString}`); 776 | } 777 | 778 | novelNew(options) { 779 | const queryString = qs.stringify(options); 780 | return this.requestUrl(`/v1/novel/new?${queryString}`); 781 | } 782 | 783 | novelComments(id, options) { 784 | if (!id) { 785 | return Promise.reject(new Error('novel_id required')); 786 | } 787 | 788 | const queryString = qs.stringify( 789 | Object.assign( 790 | { 791 | novel_id: id, 792 | include_total_comments: true, 793 | }, 794 | options 795 | ) 796 | ); 797 | return this.requestUrl(`/v1/novel/comments?${queryString}`); 798 | } 799 | 800 | novelCommentsV2(id, options) { 801 | if (!id) { 802 | return Promise.reject(new Error('novel_id required')); 803 | } 804 | 805 | const queryString = qs.stringify( 806 | Object.assign( 807 | { 808 | novel_id: id, 809 | }, 810 | options 811 | ) 812 | ); 813 | return this.requestUrl(`/v2/novel/comments?${queryString}`); 814 | } 815 | 816 | novelCommentReplies(id) { 817 | if (!id) { 818 | return Promise.reject(new Error('comment_id required')); 819 | } 820 | const queryString = qs.stringify({ comment_id: id }); 821 | return this.requestUrl(`/v1/novel/comment/replies?${queryString}`); 822 | } 823 | 824 | novelSeries(id) { 825 | if (!id) { 826 | return Promise.reject(new Error('series_id required')); 827 | } 828 | 829 | const queryString = qs.stringify({ series_id: id }); 830 | return this.requestUrl(`/v1/novel/series?${queryString}`); 831 | } 832 | 833 | novelDetail(id) { 834 | if (!id) { 835 | return Promise.reject(new Error('novel_id required')); 836 | } 837 | 838 | const queryString = qs.stringify({ novel_id: id }); 839 | return this.requestUrl(`/v2/novel/detail?${queryString}`); 840 | } 841 | 842 | novelText(id) { 843 | if (!id) { 844 | return Promise.reject(new Error('novel_id required')); 845 | } 846 | 847 | const queryString = qs.stringify({ novel_id: id }); 848 | return this.requestUrl(`/v1/novel/text?${queryString}`); 849 | } 850 | 851 | novelFollow(options) { 852 | const queryString = qs.stringify( 853 | Object.assign( 854 | { 855 | restrict: 'all', 856 | }, 857 | options 858 | ) 859 | ); 860 | return this.requestUrl(`/v1/novel/follow?${queryString}`); 861 | } 862 | 863 | novelMyPixiv() { 864 | return this.requestUrl('/v1/novel/mypixiv'); 865 | } 866 | 867 | novelRanking(options) { 868 | const queryString = qs.stringify( 869 | Object.assign( 870 | { 871 | mode: 'day', 872 | }, 873 | options 874 | ) 875 | ); 876 | return this.requestUrl(`/v1/novel/ranking?${queryString}`); 877 | } 878 | 879 | novelBookmarkDetail(id, options) { 880 | if (!id) { 881 | return Promise.reject(new Error('novel_id required')); 882 | } 883 | 884 | const queryString = qs.stringify( 885 | Object.assign( 886 | { 887 | novel_id: id, 888 | }, 889 | options 890 | ) 891 | ); 892 | return this.requestUrl(`/v2/novel/bookmark/detail?${queryString}`); 893 | } 894 | 895 | userRecommended(options) { 896 | const queryString = qs.stringify(Object.assign({}, options)); 897 | return this.requestUrl(`/v1/user/recommended?${queryString}`); 898 | } 899 | 900 | userFollowing(id, options) { 901 | if (!id) { 902 | return Promise.reject('user_id required'); 903 | } 904 | const queryString = qs.stringify( 905 | Object.assign( 906 | { 907 | user_id: id, 908 | restrict: 'public', 909 | }, 910 | options 911 | ) 912 | ); 913 | return this.requestUrl(`/v1/user/following?${queryString}`); 914 | } 915 | 916 | userFollowDetail(id) { 917 | if (!id) { 918 | return Promise.reject('user_id required'); 919 | } 920 | const queryString = qs.stringify({ user_id: id }); 921 | return this.requestUrl(`/v1/user/follow/detail?${queryString}`); 922 | } 923 | 924 | userFollower(id, options) { 925 | if (!id) { 926 | return Promise.reject('user_id required'); 927 | } 928 | const queryString = qs.stringify( 929 | Object.assign( 930 | { 931 | user_id: id, 932 | }, 933 | options 934 | ) 935 | ); 936 | return this.requestUrl(`/v1/user/follower?${queryString}`); 937 | } 938 | 939 | userMyPixiv(id) { 940 | if (!id) { 941 | return Promise.reject('user_id required'); 942 | } 943 | const queryString = qs.stringify({ user_id: id }); 944 | return this.requestUrl(`/v1/user/mypixiv?${queryString}`); 945 | } 946 | 947 | ugoiraMetaData(id) { 948 | if (!id) { 949 | return Promise.reject('illust_id required'); 950 | } 951 | const queryString = qs.stringify({ illust_id: id }); 952 | return this.requestUrl(`/v1/ugoira/metadata?${queryString}`); 953 | } 954 | 955 | setLanguage(lang) { 956 | this.headers['Accept-Language'] = lang; 957 | } 958 | 959 | requestUrl(url, options) { 960 | if (!url) { 961 | return Promise.reject('Url cannot be empty'); 962 | } 963 | options = options || {}; 964 | options.headers = Object.assign(this.getDefaultHeaders(), options.headers || {}); 965 | if (this.auth && this.auth.access_token) { 966 | options.headers.Authorization = `Bearer ${this.auth.access_token}`; 967 | } 968 | return callApi(url, options) 969 | .then(json => json) 970 | .catch(err => { 971 | if (this.rememberPassword) { 972 | if (this.username && this.password) { 973 | return this.login(this.username, this.password).then(() => { 974 | options.headers.Authorization = `Bearer ${this.auth.access_token}`; 975 | return callApi(url, options); 976 | }); 977 | } 978 | } 979 | throw err; 980 | }); 981 | } 982 | } 983 | 984 | module.exports = PixivApi; 985 | -------------------------------------------------------------------------------- /src/pixiv-login.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | const { Base64 } = require('js-base64'); 3 | const { stringify } = require('qs'); 4 | 5 | const LOGIN_URL = 'https://app-api.pixiv.net/web/v1/login'; 6 | 7 | const randToken = (len = 32) => Crypto.randomBytes(len); 8 | const sha256 = data => Crypto.createHash('sha256').update(data).digest(); 9 | 10 | const oauthPkce = () => { 11 | const code_verifier = Base64.fromUint8Array(randToken(), true); 12 | const code_challenge = Base64.encodeURI(sha256(code_verifier)); 13 | return { code_verifier, code_challenge }; 14 | }; 15 | 16 | module.exports = () => { 17 | const { code_verifier, code_challenge } = oauthPkce(); 18 | const params = { 19 | code_challenge, 20 | code_challenge_method: 'S256', 21 | client: 'pixiv-android', 22 | }; 23 | return { 24 | login_url: `${LOGIN_URL}?${stringify(params)}`, 25 | code_verifier, 26 | }; 27 | }; 28 | -------------------------------------------------------------------------------- /src/protocol/config.js: -------------------------------------------------------------------------------- 1 | const Fs = require('fs-extra'); 2 | const Path = require('path'); 3 | 4 | const CONFIG_FILE_DIR = require('appdata-path').getAppDataPath('pxder'); 5 | const CONFIG_FILE = Path.resolve(CONFIG_FILE_DIR, 'protocol.json'); 6 | 7 | const writeConfig = (config = { registered: false, port: 0 }) => { 8 | Fs.ensureDirSync(CONFIG_FILE_DIR); 9 | Fs.writeJsonSync(CONFIG_FILE, config); 10 | return config; 11 | }; 12 | 13 | const readConfig = () => Fs.readJsonSync(CONFIG_FILE); 14 | 15 | const getConfig = () => { 16 | try { 17 | return readConfig(); 18 | } catch (error) { 19 | return writeConfig(); 20 | } 21 | }; 22 | 23 | const data = getConfig(); 24 | 25 | module.exports = { 26 | data, 27 | modify: obj => writeConfig(Object.assign(data, obj)), 28 | }; 29 | -------------------------------------------------------------------------------- /src/protocol/index.js: -------------------------------------------------------------------------------- 1 | const Protocol = require('register-protocol-win32'); 2 | const Path = require('path'); 3 | const Config = require('./config'); 4 | 5 | const PROTOCOL_NAME = 'pixiv'; 6 | 7 | const protocolExists = () => Protocol.exists(PROTOCOL_NAME).catch(() => {}); 8 | 9 | const uninstall = async () => { 10 | const success = await Protocol.uninstall(PROTOCOL_NAME) 11 | .then(() => true) 12 | .catch(() => false); 13 | if (success) Config.modify({ registered: false }); 14 | return success; 15 | }; 16 | 17 | const install = async () => { 18 | const cmd = `"${process.execPath}" "${Path.resolve(__dirname, 'sender.js')}" "%1"`; 19 | const success = await Protocol.install(PROTOCOL_NAME, cmd) 20 | .then(() => true) 21 | .catch(() => false); 22 | if (success) Config.modify({ registered: true }); 23 | return success; 24 | }; 25 | 26 | const canInstall = async () => { 27 | const exists = await protocolExists(); 28 | if (typeof exists !== 'boolean') return false; 29 | return !(!Config.data.registered && exists); 30 | }; 31 | 32 | module.exports = { 33 | install, 34 | uninstall, 35 | canInstall, 36 | exists: protocolExists, 37 | }; 38 | -------------------------------------------------------------------------------- /src/protocol/receiver.js: -------------------------------------------------------------------------------- 1 | const Config = require('./config'); 2 | const Http = require('http'); 3 | 4 | module.exports = () => 5 | new Promise(resolve => { 6 | const server = Http.createServer((req, res) => { 7 | res.writeHead(200, { Connection: 'close' }); 8 | res.end(); 9 | const url = new URL(`http://host${req.url}`); 10 | const code = url.searchParams.get('code'); 11 | if (!code) return; 12 | resolve(code); 13 | server.close(() => { 14 | Config.modify({ port: 0 }); 15 | }); 16 | }).listen(0, '127.0.0.1', () => { 17 | Config.modify({ port: server.address().port }); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /src/protocol/sender.js: -------------------------------------------------------------------------------- 1 | const Config = require('./config'); 2 | const { get } = require('axios').default; 3 | 4 | try { 5 | const arg = process.argv[process.argv.length - 1]; 6 | const url = new URL(arg); 7 | const code = url.searchParams.get('code'); 8 | const port = Config.data.port; 9 | if (code && port) { 10 | get(`http://127.0.0.1:${port}/?code=${code}`); 11 | } 12 | } catch (error) {} 13 | -------------------------------------------------------------------------------- /src/proxy.js: -------------------------------------------------------------------------------- 1 | const flatMap = require('lodash.flatmap'); 2 | const { ProxyAgent } = require('proxy-agent'); 3 | 4 | const envNames = flatMap(['all_proxy', 'https_proxy', 'http_proxy'], name => [name, name.toUpperCase()]); 5 | 6 | function checkProxy(proxy) { 7 | return typeof proxy === 'string' && /(^$)|(^disable$)|(^(https?|socks(4a?|5h?)?):\/\/.)|(^pac\+(file|ftp|https?):\/\/.)/.test(proxy); 8 | } 9 | 10 | function getProxyAgent(proxy) { 11 | if (checkProxy(proxy) && proxy !== 'disable') { 12 | if (!proxy) return new ProxyAgent(); 13 | return new ProxyAgent({ getProxyForUrl: () => proxy }); 14 | } 15 | return null; 16 | } 17 | 18 | function getSysProxy() { 19 | const proxyEnv = envNames.find(name => process.env[name]); 20 | return proxyEnv ? proxyEnv.trim() : null; 21 | } 22 | 23 | function delSysProxy() { 24 | envNames.forEach(name => delete process.env[name]); 25 | } 26 | 27 | module.exports = { 28 | checkProxy, 29 | getProxyAgent, 30 | getSysProxy, 31 | delSysProxy, 32 | }; 33 | -------------------------------------------------------------------------------- /src/tools.js: -------------------------------------------------------------------------------- 1 | const Fse = require('fs-extra'); 2 | const Path = require('path'); 3 | const Readline = require('readline'); 4 | const Axios = require('axios').default; 5 | const { AbortController } = require('node-abort-controller'); 6 | 7 | function showProgress(valFn) { 8 | return setInterval(() => { 9 | Readline.clearLine(process.stdout, 0); 10 | Readline.cursorTo(process.stdout, 0); 11 | process.stdout.write('Progress: ' + `${valFn()}`.green); 12 | }, 500); 13 | } 14 | 15 | function clearProgress(interval) { 16 | clearInterval(interval); 17 | Readline.clearLine(process.stdout, 0); 18 | Readline.cursorTo(process.stdout, 0); 19 | } 20 | 21 | /** 22 | * Download file via axios, will make directories automatically 23 | * 24 | * @param {string} dirpath Directory path 25 | * @param {string} filename Filename 26 | * @param {string} url URL 27 | * @param {import('axios').AxiosRequestConfig} axiosOption Option for axios 28 | * @returns Axios promise 29 | */ 30 | async function download(dirpath, filename, url, axiosOption) { 31 | Fse.ensureDirSync(dirpath); 32 | 33 | const controller = new AbortController(); 34 | axiosOption = { 35 | headers: {}, 36 | ...axiosOption, 37 | responseType: 'arraybuffer', 38 | signal: controller.signal, 39 | }; 40 | 41 | const finalUrl = new URL(url); 42 | 43 | // axios timeout 只针对 response,不针对 connection,因此需要二重保险 44 | let timeout = axiosOption.timeout ? setTimeout(() => controller.abort(), axiosOption.timeout * 2) : null; 45 | 46 | try { 47 | const res = await Axios.get(finalUrl.href, axiosOption); 48 | if (timeout) { 49 | clearTimeout(timeout); 50 | timeout = null; 51 | } 52 | Fse.writeFileSync(Path.join(dirpath, filename), res.data); 53 | return res; 54 | } catch (e) { 55 | if (timeout) clearTimeout(timeout); 56 | if (e && e.message === 'canceled') throw new Error('Connection timeout'); 57 | throw e; 58 | } 59 | } 60 | 61 | function readJsonSafely(path, defaultValue) { 62 | if (!Fse.existsSync(path)) return defaultValue; 63 | try { 64 | return Fse.readJsonSync(path); 65 | } catch (error) {} 66 | return defaultValue; 67 | } 68 | 69 | class UgoiraDir { 70 | constructor(dirpath) { 71 | this.files = new Set( 72 | Fse.existsSync(dirpath) 73 | ? Fse.readdirSync(dirpath) 74 | .filter(file => file.endsWith('.zip')) 75 | .map(file => file.replace(/@\d+?ms/g, '')) 76 | : [] 77 | ); 78 | } 79 | 80 | existsSync(file) { 81 | return this.files.has(file.replace(/@\d+?ms/g, '')); 82 | } 83 | } 84 | 85 | module.exports = { 86 | UgoiraDir, 87 | showProgress, 88 | clearProgress, 89 | download, 90 | readJsonSafely, 91 | logError: require('./logError'), 92 | }; 93 | -------------------------------------------------------------------------------- /src/updateChecker.js: -------------------------------------------------------------------------------- 1 | const getLatestVersion = require('latest-version'); 2 | const compareVersions = require('compare-versions'); 3 | const Fse = require('fs-extra'); 4 | const Path = require('path'); 5 | const Tools = require('./tools'); 6 | 7 | const configFileDir = require('appdata-path').getAppDataPath('pxder'); 8 | const checkLogFile = Path.join(configFileDir, 'update.json'); 9 | const { name, version } = require('../package.json'); 10 | 11 | class UpdateChecker { 12 | constructor() { 13 | this.info = Tools.readJsonSafely(checkLogFile, { 14 | lastCheck: 0, 15 | latestVersion: '0', 16 | }); 17 | } 18 | 19 | async check() { 20 | try { 21 | const agent = global.proxyAgent; 22 | const latestVersion = await getLatestVersion(name, agent ? { agent } : {}); 23 | this.info.latestVersion = latestVersion; 24 | Fse.writeJsonSync(checkLogFile, this.info); 25 | } catch {} 26 | } 27 | 28 | haveUpdate() { 29 | return compareVersions(this.info.latestVersion, version) > 0; 30 | } 31 | 32 | recentlyChecked() { 33 | return this.info.lastCheck + 3 * 24 * 60 * 60 * 1000 < Date.now(); 34 | } 35 | 36 | /** 37 | * 取得最新版本号 38 | * 39 | * @returns {string} 最新版本号 40 | * @memberof UpdateChecker 41 | */ 42 | getLatestVersion() { 43 | return this.info.latestVersion; 44 | } 45 | } 46 | 47 | module.exports = UpdateChecker; 48 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@eslint-community/eslint-utils@^4.2.0": 6 | version "4.4.0" 7 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 8 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 9 | dependencies: 10 | eslint-visitor-keys "^3.3.0" 11 | 12 | "@eslint-community/regexpp@^4.4.0": 13 | version "4.5.1" 14 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" 15 | integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== 16 | 17 | "@eslint/eslintrc@^2.0.3": 18 | version "2.0.3" 19 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" 20 | integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== 21 | dependencies: 22 | ajv "^6.12.4" 23 | debug "^4.3.2" 24 | espree "^9.5.2" 25 | globals "^13.19.0" 26 | ignore "^5.2.0" 27 | import-fresh "^3.2.1" 28 | js-yaml "^4.1.0" 29 | minimatch "^3.1.2" 30 | strip-json-comments "^3.1.1" 31 | 32 | "@eslint/js@8.41.0": 33 | version "8.41.0" 34 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" 35 | integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== 36 | 37 | "@humanwhocodes/config-array@^0.11.8": 38 | version "0.11.8" 39 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" 40 | integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== 41 | dependencies: 42 | "@humanwhocodes/object-schema" "^1.2.1" 43 | debug "^4.1.1" 44 | minimatch "^3.0.5" 45 | 46 | "@humanwhocodes/module-importer@^1.0.1": 47 | version "1.0.1" 48 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 49 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 50 | 51 | "@humanwhocodes/object-schema@^1.2.1": 52 | version "1.2.1" 53 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 54 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 55 | 56 | "@nodelib/fs.scandir@2.1.5": 57 | version "2.1.5" 58 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 59 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 60 | dependencies: 61 | "@nodelib/fs.stat" "2.0.5" 62 | run-parallel "^1.1.9" 63 | 64 | "@nodelib/fs.stat@2.0.5": 65 | version "2.0.5" 66 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 67 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 68 | 69 | "@nodelib/fs.walk@^1.2.8": 70 | version "1.2.8" 71 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 72 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 73 | dependencies: 74 | "@nodelib/fs.scandir" "2.1.5" 75 | fastq "^1.6.0" 76 | 77 | "@sindresorhus/is@^0.14.0": 78 | version "0.14.0" 79 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 80 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 81 | 82 | "@szmarczak/http-timer@^1.1.2": 83 | version "1.1.2" 84 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 85 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 86 | dependencies: 87 | defer-to-connect "^1.0.1" 88 | 89 | "@tsuk1ko/postversion@^1.0.2": 90 | version "1.0.2" 91 | resolved "https://registry.yarnpkg.com/@tsuk1ko/postversion/-/postversion-1.0.2.tgz#69b29969b96e2c24cf0081366818ef4d23cc22a5" 92 | integrity sha512-8SHVF8AA0iZhlmzv3QZ+1I5luKelVc7J6WAJbkRZJ638+zmxTadyNSVIiu4LxRfb6823MDHUra9HjVNw+Pigmg== 93 | dependencies: 94 | yesno "^0.4.0" 95 | 96 | "@types/eslint@^8.40.0": 97 | version "8.40.0" 98 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.0.tgz#ae73dc9ec5237f2794c4f79efd6a4c73b13daf23" 99 | integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g== 100 | dependencies: 101 | "@types/estree" "*" 102 | "@types/json-schema" "*" 103 | 104 | "@types/estree@*": 105 | version "0.0.50" 106 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" 107 | integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== 108 | 109 | "@types/fs-extra@^11.0.1": 110 | version "11.0.1" 111 | resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" 112 | integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== 113 | dependencies: 114 | "@types/jsonfile" "*" 115 | "@types/node" "*" 116 | 117 | "@types/json-schema@*": 118 | version "7.0.9" 119 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" 120 | integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== 121 | 122 | "@types/json5@^0.0.29": 123 | version "0.0.29" 124 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 125 | integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= 126 | 127 | "@types/jsonfile@*": 128 | version "6.1.1" 129 | resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.1.tgz#ac84e9aefa74a2425a0fb3012bdea44f58970f1b" 130 | integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== 131 | dependencies: 132 | "@types/node" "*" 133 | 134 | "@types/lodash.flatmap@^4.5.7": 135 | version "4.5.7" 136 | resolved "https://registry.yarnpkg.com/@types/lodash.flatmap/-/lodash.flatmap-4.5.7.tgz#f9eb29afd2d81121950d7647b4520367b1b3d81f" 137 | integrity sha512-ZTfFXFpta2MU1SkoidRz4QMPpFJdFuZkDNffofj/b3XGT59vD0cpddO0agiwjp9l8KIjLNHRcaAUpi2/izUmFw== 138 | dependencies: 139 | "@types/lodash" "*" 140 | 141 | "@types/lodash@*": 142 | version "4.14.178" 143 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" 144 | integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== 145 | 146 | "@types/node@*": 147 | version "17.0.8" 148 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" 149 | integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== 150 | 151 | "@types/prompts@^2.4.4": 152 | version "2.4.4" 153 | resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.4.4.tgz#dd5a1d41cb1bcd0fc4464bf44a0c8354f36ea735" 154 | integrity sha512-p5N9uoTH76lLvSAaYSZtBCdEXzpOOufsRjnhjVSrZGXikVGHX9+cc9ERtHRV4hvBKHyZb1bg4K+56Bd2TqUn4A== 155 | dependencies: 156 | "@types/node" "*" 157 | kleur "^3.0.3" 158 | 159 | "@types/readline-sync@^1.4.4": 160 | version "1.4.4" 161 | resolved "https://registry.yarnpkg.com/@types/readline-sync/-/readline-sync-1.4.4.tgz#8568292efe4ddd94d0ccee958b29cc3f4e0ea140" 162 | integrity sha512-cFjVIoiamX7U6zkO2VPvXyTxbFDdiRo902IarJuPVxBhpDnXhwSaVE86ip+SCuyWBbEioKCkT4C88RNTxBM1Dw== 163 | 164 | acorn-jsx@^5.3.2: 165 | version "5.3.2" 166 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 167 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 168 | 169 | acorn-walk@^8.2.0: 170 | version "8.2.0" 171 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 172 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 173 | 174 | acorn@^8.7.0, acorn@^8.8.0: 175 | version "8.8.2" 176 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" 177 | integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== 178 | 179 | agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: 180 | version "7.1.0" 181 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" 182 | integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== 183 | dependencies: 184 | debug "^4.3.4" 185 | 186 | ajv@^6.10.0, ajv@^6.12.4: 187 | version "6.12.6" 188 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 189 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 190 | dependencies: 191 | fast-deep-equal "^3.1.1" 192 | fast-json-stable-stringify "^2.0.0" 193 | json-schema-traverse "^0.4.1" 194 | uri-js "^4.2.2" 195 | 196 | ansi-regex@^5.0.1: 197 | version "5.0.1" 198 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 199 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 200 | 201 | ansi-styles@^4.1.0: 202 | version "4.3.0" 203 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 204 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 205 | dependencies: 206 | color-convert "^2.0.1" 207 | 208 | appdata-path@^1.0.0: 209 | version "1.0.0" 210 | resolved "https://registry.yarnpkg.com/appdata-path/-/appdata-path-1.0.0.tgz#c4022d0b6727d1ddc1dd7ecec143d4352f3eefad" 211 | integrity sha512-ZbH3ezXfnT/YE3NdqduIt4lBV+H0ybvA2Qx3K76gIjQvh8gROpDFdDLpx6B1QJtW7zxisCbpTlCLhKqoR8cDBw== 212 | 213 | argparse@^2.0.1: 214 | version "2.0.1" 215 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 216 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 217 | 218 | array-buffer-byte-length@^1.0.0: 219 | version "1.0.0" 220 | resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" 221 | integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== 222 | dependencies: 223 | call-bind "^1.0.2" 224 | is-array-buffer "^3.0.1" 225 | 226 | array-includes@^3.1.6: 227 | version "3.1.6" 228 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" 229 | integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== 230 | dependencies: 231 | call-bind "^1.0.2" 232 | define-properties "^1.1.4" 233 | es-abstract "^1.20.4" 234 | get-intrinsic "^1.1.3" 235 | is-string "^1.0.7" 236 | 237 | array.prototype.flat@^1.3.1: 238 | version "1.3.1" 239 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" 240 | integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== 241 | dependencies: 242 | call-bind "^1.0.2" 243 | define-properties "^1.1.4" 244 | es-abstract "^1.20.4" 245 | es-shim-unscopables "^1.0.0" 246 | 247 | array.prototype.flatmap@^1.3.1: 248 | version "1.3.1" 249 | resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" 250 | integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== 251 | dependencies: 252 | call-bind "^1.0.2" 253 | define-properties "^1.1.4" 254 | es-abstract "^1.20.4" 255 | es-shim-unscopables "^1.0.0" 256 | 257 | ast-types@^0.13.2: 258 | version "0.13.4" 259 | resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" 260 | integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== 261 | dependencies: 262 | tslib "^2.0.1" 263 | 264 | available-typed-arrays@^1.0.5: 265 | version "1.0.5" 266 | resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" 267 | integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== 268 | 269 | axios@^0.21.1: 270 | version "0.21.1" 271 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" 272 | integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== 273 | dependencies: 274 | follow-redirects "^1.10.0" 275 | 276 | axios@^0.24.0: 277 | version "0.24.0" 278 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" 279 | integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== 280 | dependencies: 281 | follow-redirects "^1.14.4" 282 | 283 | balanced-match@^1.0.0: 284 | version "1.0.0" 285 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 286 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 287 | 288 | basic-ftp@^5.0.2: 289 | version "5.0.3" 290 | resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.3.tgz#b14c0fe8111ce001ec913686434fe0c2fb461228" 291 | integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== 292 | 293 | blueimp-md5@^2.12.0: 294 | version "2.13.0" 295 | resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.13.0.tgz#07314b0c64dda0bf1733f96ce40d5af94eb28965" 296 | integrity sha512-lmp0m647R5e77ORduxLW5mISIDcvgJZa52vMBv5uVI3UmSWTQjkJsZVBfaFqQPw/QFogJwvY6e3Gl9nP+Loe+Q== 297 | 298 | brace-expansion@^1.1.7: 299 | version "1.1.11" 300 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 301 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 302 | dependencies: 303 | balanced-match "^1.0.0" 304 | concat-map "0.0.1" 305 | 306 | cacheable-request@^6.0.0: 307 | version "6.1.0" 308 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 309 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 310 | dependencies: 311 | clone-response "^1.0.2" 312 | get-stream "^5.1.0" 313 | http-cache-semantics "^4.0.0" 314 | keyv "^3.0.0" 315 | lowercase-keys "^2.0.0" 316 | normalize-url "^4.1.0" 317 | responselike "^1.0.2" 318 | 319 | call-bind@^1.0.0: 320 | version "1.0.0" 321 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" 322 | integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== 323 | dependencies: 324 | function-bind "^1.1.1" 325 | get-intrinsic "^1.0.0" 326 | 327 | call-bind@^1.0.2: 328 | version "1.0.2" 329 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 330 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 331 | dependencies: 332 | function-bind "^1.1.1" 333 | get-intrinsic "^1.0.2" 334 | 335 | callsites@^3.0.0: 336 | version "3.1.0" 337 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 338 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 339 | 340 | chalk@^4.0.0: 341 | version "4.1.0" 342 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 343 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 344 | dependencies: 345 | ansi-styles "^4.1.0" 346 | supports-color "^7.1.0" 347 | 348 | clone-response@^1.0.2: 349 | version "1.0.3" 350 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" 351 | integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== 352 | dependencies: 353 | mimic-response "^1.0.0" 354 | 355 | color-convert@^2.0.1: 356 | version "2.0.1" 357 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 358 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 359 | dependencies: 360 | color-name "~1.1.4" 361 | 362 | color-name@~1.1.4: 363 | version "1.1.4" 364 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 365 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 366 | 367 | colors@1.4.0: 368 | version "1.4.0" 369 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" 370 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 371 | 372 | commander@^5.1.0: 373 | version "5.1.0" 374 | resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" 375 | integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== 376 | 377 | compare-versions@^4.1.4: 378 | version "4.1.4" 379 | resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.4.tgz#3571f4d610924d4414846a4183d386c8f3d51112" 380 | integrity sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw== 381 | 382 | concat-map@0.0.1: 383 | version "0.0.1" 384 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 385 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 386 | 387 | cross-spawn@^7.0.2: 388 | version "7.0.3" 389 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 390 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 391 | dependencies: 392 | path-key "^3.1.0" 393 | shebang-command "^2.0.0" 394 | which "^2.0.1" 395 | 396 | data-uri-to-buffer@^5.0.1: 397 | version "5.0.1" 398 | resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" 399 | integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== 400 | 401 | debug@4: 402 | version "4.1.1" 403 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 404 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 405 | dependencies: 406 | ms "^2.1.1" 407 | 408 | debug@^3.2.7: 409 | version "3.2.7" 410 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 411 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 412 | dependencies: 413 | ms "^2.1.1" 414 | 415 | debug@^4.1.1: 416 | version "4.3.1" 417 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 418 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 419 | dependencies: 420 | ms "2.1.2" 421 | 422 | debug@^4.3.2: 423 | version "4.3.3" 424 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 425 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 426 | dependencies: 427 | ms "2.1.2" 428 | 429 | debug@^4.3.4: 430 | version "4.3.4" 431 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 432 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 433 | dependencies: 434 | ms "2.1.2" 435 | 436 | decompress-response@^3.3.0: 437 | version "3.3.0" 438 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 439 | integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== 440 | dependencies: 441 | mimic-response "^1.0.0" 442 | 443 | deep-extend@^0.6.0: 444 | version "0.6.0" 445 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 446 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 447 | 448 | deep-is@^0.1.3: 449 | version "0.1.3" 450 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 451 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 452 | 453 | deep-is@~0.1.3: 454 | version "0.1.4" 455 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 456 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 457 | 458 | defer-to-connect@^1.0.1: 459 | version "1.1.3" 460 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 461 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 462 | 463 | define-lazy-prop@^2.0.0: 464 | version "2.0.0" 465 | resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" 466 | integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== 467 | 468 | define-properties@^1.1.3: 469 | version "1.1.3" 470 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 471 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 472 | dependencies: 473 | object-keys "^1.0.12" 474 | 475 | define-properties@^1.1.4, define-properties@^1.2.0: 476 | version "1.2.0" 477 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" 478 | integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== 479 | dependencies: 480 | has-property-descriptors "^1.0.0" 481 | object-keys "^1.1.1" 482 | 483 | degenerator@^4.0.1: 484 | version "4.0.2" 485 | resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-4.0.2.tgz#55b7fb41239ee0ea7644fa3f2aba84e0adfaa40c" 486 | integrity sha512-HKwIFvZROUMfH3qI3gBpD61BYh7q3c3GXD5UGZzoVNJwVSYgZKvYl1fRMXc9ozoTxl/VZxKJ5v/bA+19tywFiw== 487 | dependencies: 488 | ast-types "^0.13.2" 489 | escodegen "^1.8.1" 490 | esprima "^4.0.0" 491 | vm2 "^3.9.17" 492 | 493 | doctrine@^2.1.0: 494 | version "2.1.0" 495 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 496 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 497 | dependencies: 498 | esutils "^2.0.2" 499 | 500 | doctrine@^3.0.0: 501 | version "3.0.0" 502 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 503 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 504 | dependencies: 505 | esutils "^2.0.2" 506 | 507 | duplexer3@^0.1.4: 508 | version "0.1.5" 509 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" 510 | integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== 511 | 512 | end-of-stream@^1.1.0: 513 | version "1.4.4" 514 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 515 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 516 | dependencies: 517 | once "^1.4.0" 518 | 519 | es-abstract@^1.19.0: 520 | version "1.19.1" 521 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" 522 | integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== 523 | dependencies: 524 | call-bind "^1.0.2" 525 | es-to-primitive "^1.2.1" 526 | function-bind "^1.1.1" 527 | get-intrinsic "^1.1.1" 528 | get-symbol-description "^1.0.0" 529 | has "^1.0.3" 530 | has-symbols "^1.0.2" 531 | internal-slot "^1.0.3" 532 | is-callable "^1.2.4" 533 | is-negative-zero "^2.0.1" 534 | is-regex "^1.1.4" 535 | is-shared-array-buffer "^1.0.1" 536 | is-string "^1.0.7" 537 | is-weakref "^1.0.1" 538 | object-inspect "^1.11.0" 539 | object-keys "^1.1.1" 540 | object.assign "^4.1.2" 541 | string.prototype.trimend "^1.0.4" 542 | string.prototype.trimstart "^1.0.4" 543 | unbox-primitive "^1.0.1" 544 | 545 | es-abstract@^1.20.4: 546 | version "1.21.2" 547 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" 548 | integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== 549 | dependencies: 550 | array-buffer-byte-length "^1.0.0" 551 | available-typed-arrays "^1.0.5" 552 | call-bind "^1.0.2" 553 | es-set-tostringtag "^2.0.1" 554 | es-to-primitive "^1.2.1" 555 | function.prototype.name "^1.1.5" 556 | get-intrinsic "^1.2.0" 557 | get-symbol-description "^1.0.0" 558 | globalthis "^1.0.3" 559 | gopd "^1.0.1" 560 | has "^1.0.3" 561 | has-property-descriptors "^1.0.0" 562 | has-proto "^1.0.1" 563 | has-symbols "^1.0.3" 564 | internal-slot "^1.0.5" 565 | is-array-buffer "^3.0.2" 566 | is-callable "^1.2.7" 567 | is-negative-zero "^2.0.2" 568 | is-regex "^1.1.4" 569 | is-shared-array-buffer "^1.0.2" 570 | is-string "^1.0.7" 571 | is-typed-array "^1.1.10" 572 | is-weakref "^1.0.2" 573 | object-inspect "^1.12.3" 574 | object-keys "^1.1.1" 575 | object.assign "^4.1.4" 576 | regexp.prototype.flags "^1.4.3" 577 | safe-regex-test "^1.0.0" 578 | string.prototype.trim "^1.2.7" 579 | string.prototype.trimend "^1.0.6" 580 | string.prototype.trimstart "^1.0.6" 581 | typed-array-length "^1.0.4" 582 | unbox-primitive "^1.0.2" 583 | which-typed-array "^1.1.9" 584 | 585 | es-set-tostringtag@^2.0.1: 586 | version "2.0.1" 587 | resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" 588 | integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== 589 | dependencies: 590 | get-intrinsic "^1.1.3" 591 | has "^1.0.3" 592 | has-tostringtag "^1.0.0" 593 | 594 | es-shim-unscopables@^1.0.0: 595 | version "1.0.0" 596 | resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" 597 | integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== 598 | dependencies: 599 | has "^1.0.3" 600 | 601 | es-to-primitive@^1.2.1: 602 | version "1.2.1" 603 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 604 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 605 | dependencies: 606 | is-callable "^1.1.4" 607 | is-date-object "^1.0.1" 608 | is-symbol "^1.0.2" 609 | 610 | escape-string-regexp@^4.0.0: 611 | version "4.0.0" 612 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 613 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 614 | 615 | escodegen@^1.8.1: 616 | version "1.14.3" 617 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" 618 | integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== 619 | dependencies: 620 | esprima "^4.0.1" 621 | estraverse "^4.2.0" 622 | esutils "^2.0.2" 623 | optionator "^0.8.1" 624 | optionalDependencies: 625 | source-map "~0.6.1" 626 | 627 | eslint-config-standard@^17.1.0: 628 | version "17.1.0" 629 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" 630 | integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== 631 | 632 | eslint-import-resolver-node@^0.3.7: 633 | version "0.3.7" 634 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" 635 | integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== 636 | dependencies: 637 | debug "^3.2.7" 638 | is-core-module "^2.11.0" 639 | resolve "^1.22.1" 640 | 641 | eslint-module-utils@^2.7.4: 642 | version "2.8.0" 643 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" 644 | integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== 645 | dependencies: 646 | debug "^3.2.7" 647 | 648 | eslint-plugin-es@^3.0.0: 649 | version "3.0.1" 650 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" 651 | integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== 652 | dependencies: 653 | eslint-utils "^2.0.0" 654 | regexpp "^3.0.0" 655 | 656 | eslint-plugin-import@^2.27.5: 657 | version "2.27.5" 658 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" 659 | integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== 660 | dependencies: 661 | array-includes "^3.1.6" 662 | array.prototype.flat "^1.3.1" 663 | array.prototype.flatmap "^1.3.1" 664 | debug "^3.2.7" 665 | doctrine "^2.1.0" 666 | eslint-import-resolver-node "^0.3.7" 667 | eslint-module-utils "^2.7.4" 668 | has "^1.0.3" 669 | is-core-module "^2.11.0" 670 | is-glob "^4.0.3" 671 | minimatch "^3.1.2" 672 | object.values "^1.1.6" 673 | resolve "^1.22.1" 674 | semver "^6.3.0" 675 | tsconfig-paths "^3.14.1" 676 | 677 | eslint-plugin-node@^11.1.0: 678 | version "11.1.0" 679 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" 680 | integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== 681 | dependencies: 682 | eslint-plugin-es "^3.0.0" 683 | eslint-utils "^2.0.0" 684 | ignore "^5.1.1" 685 | minimatch "^3.0.4" 686 | resolve "^1.10.1" 687 | semver "^6.1.0" 688 | 689 | eslint-plugin-promise@^6.1.1: 690 | version "6.1.1" 691 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" 692 | integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== 693 | 694 | eslint-plugin-standard@^5.0.0: 695 | version "5.0.0" 696 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz#c43f6925d669f177db46f095ea30be95476b1ee4" 697 | integrity sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg== 698 | 699 | eslint-scope@^7.2.0: 700 | version "7.2.0" 701 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" 702 | integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== 703 | dependencies: 704 | esrecurse "^4.3.0" 705 | estraverse "^5.2.0" 706 | 707 | eslint-utils@^2.0.0: 708 | version "2.1.0" 709 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 710 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 711 | dependencies: 712 | eslint-visitor-keys "^1.1.0" 713 | 714 | eslint-visitor-keys@^1.1.0: 715 | version "1.3.0" 716 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 717 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 718 | 719 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: 720 | version "3.4.1" 721 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" 722 | integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== 723 | 724 | eslint@^8.41.0: 725 | version "8.41.0" 726 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" 727 | integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== 728 | dependencies: 729 | "@eslint-community/eslint-utils" "^4.2.0" 730 | "@eslint-community/regexpp" "^4.4.0" 731 | "@eslint/eslintrc" "^2.0.3" 732 | "@eslint/js" "8.41.0" 733 | "@humanwhocodes/config-array" "^0.11.8" 734 | "@humanwhocodes/module-importer" "^1.0.1" 735 | "@nodelib/fs.walk" "^1.2.8" 736 | ajv "^6.10.0" 737 | chalk "^4.0.0" 738 | cross-spawn "^7.0.2" 739 | debug "^4.3.2" 740 | doctrine "^3.0.0" 741 | escape-string-regexp "^4.0.0" 742 | eslint-scope "^7.2.0" 743 | eslint-visitor-keys "^3.4.1" 744 | espree "^9.5.2" 745 | esquery "^1.4.2" 746 | esutils "^2.0.2" 747 | fast-deep-equal "^3.1.3" 748 | file-entry-cache "^6.0.1" 749 | find-up "^5.0.0" 750 | glob-parent "^6.0.2" 751 | globals "^13.19.0" 752 | graphemer "^1.4.0" 753 | ignore "^5.2.0" 754 | import-fresh "^3.0.0" 755 | imurmurhash "^0.1.4" 756 | is-glob "^4.0.0" 757 | is-path-inside "^3.0.3" 758 | js-yaml "^4.1.0" 759 | json-stable-stringify-without-jsonify "^1.0.1" 760 | levn "^0.4.1" 761 | lodash.merge "^4.6.2" 762 | minimatch "^3.1.2" 763 | natural-compare "^1.4.0" 764 | optionator "^0.9.1" 765 | strip-ansi "^6.0.1" 766 | strip-json-comments "^3.1.0" 767 | text-table "^0.2.0" 768 | 769 | espree@^9.5.2: 770 | version "9.5.2" 771 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" 772 | integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== 773 | dependencies: 774 | acorn "^8.8.0" 775 | acorn-jsx "^5.3.2" 776 | eslint-visitor-keys "^3.4.1" 777 | 778 | esprima@^4.0.0, esprima@^4.0.1: 779 | version "4.0.1" 780 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 781 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 782 | 783 | esquery@^1.4.2: 784 | version "1.5.0" 785 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" 786 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 787 | dependencies: 788 | estraverse "^5.1.0" 789 | 790 | esrecurse@^4.3.0: 791 | version "4.3.0" 792 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 793 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 794 | dependencies: 795 | estraverse "^5.2.0" 796 | 797 | estraverse@^4.2.0: 798 | version "4.3.0" 799 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 800 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 801 | 802 | estraverse@^5.1.0, estraverse@^5.2.0: 803 | version "5.2.0" 804 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 805 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 806 | 807 | esutils@^2.0.2: 808 | version "2.0.3" 809 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 810 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 811 | 812 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 813 | version "3.1.3" 814 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 815 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 816 | 817 | fast-json-stable-stringify@^2.0.0: 818 | version "2.1.0" 819 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 820 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 821 | 822 | fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: 823 | version "2.0.6" 824 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 825 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 826 | 827 | fastq@^1.6.0: 828 | version "1.15.0" 829 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 830 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 831 | dependencies: 832 | reusify "^1.0.4" 833 | 834 | file-entry-cache@^6.0.1: 835 | version "6.0.1" 836 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 837 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 838 | dependencies: 839 | flat-cache "^3.0.4" 840 | 841 | find-up@^5.0.0: 842 | version "5.0.0" 843 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 844 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 845 | dependencies: 846 | locate-path "^6.0.0" 847 | path-exists "^4.0.0" 848 | 849 | flat-cache@^3.0.4: 850 | version "3.0.4" 851 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 852 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 853 | dependencies: 854 | flatted "^3.1.0" 855 | rimraf "^3.0.2" 856 | 857 | flatted@^3.1.0: 858 | version "3.1.0" 859 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" 860 | integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== 861 | 862 | follow-redirects@^1.10.0: 863 | version "1.13.0" 864 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" 865 | integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== 866 | 867 | follow-redirects@^1.14.4: 868 | version "1.14.7" 869 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" 870 | integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== 871 | 872 | for-each@^0.3.3: 873 | version "0.3.3" 874 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" 875 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== 876 | dependencies: 877 | is-callable "^1.1.3" 878 | 879 | fs-extra@^11.1.1: 880 | version "11.1.1" 881 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" 882 | integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== 883 | dependencies: 884 | graceful-fs "^4.2.0" 885 | jsonfile "^6.0.1" 886 | universalify "^2.0.0" 887 | 888 | fs-extra@^8.1.0: 889 | version "8.1.0" 890 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 891 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 892 | dependencies: 893 | graceful-fs "^4.2.0" 894 | jsonfile "^4.0.0" 895 | universalify "^0.1.0" 896 | 897 | fs.realpath@^1.0.0: 898 | version "1.0.0" 899 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 900 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 901 | 902 | function-bind@^1.1.1: 903 | version "1.1.1" 904 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 905 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 906 | 907 | function.prototype.name@^1.1.5: 908 | version "1.1.5" 909 | resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" 910 | integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== 911 | dependencies: 912 | call-bind "^1.0.2" 913 | define-properties "^1.1.3" 914 | es-abstract "^1.19.0" 915 | functions-have-names "^1.2.2" 916 | 917 | functions-have-names@^1.2.2, functions-have-names@^1.2.3: 918 | version "1.2.3" 919 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 920 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 921 | 922 | get-intrinsic@^1.0.0: 923 | version "1.0.1" 924 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" 925 | integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== 926 | dependencies: 927 | function-bind "^1.1.1" 928 | has "^1.0.3" 929 | has-symbols "^1.0.1" 930 | 931 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: 932 | version "1.1.1" 933 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 934 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 935 | dependencies: 936 | function-bind "^1.1.1" 937 | has "^1.0.3" 938 | has-symbols "^1.0.1" 939 | 940 | get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: 941 | version "1.2.1" 942 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" 943 | integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== 944 | dependencies: 945 | function-bind "^1.1.1" 946 | has "^1.0.3" 947 | has-proto "^1.0.1" 948 | has-symbols "^1.0.3" 949 | 950 | get-stream@^4.1.0: 951 | version "4.1.0" 952 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 953 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 954 | dependencies: 955 | pump "^3.0.0" 956 | 957 | get-stream@^5.1.0: 958 | version "5.2.0" 959 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 960 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 961 | dependencies: 962 | pump "^3.0.0" 963 | 964 | get-symbol-description@^1.0.0: 965 | version "1.0.0" 966 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" 967 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 968 | dependencies: 969 | call-bind "^1.0.2" 970 | get-intrinsic "^1.1.1" 971 | 972 | get-uri@^6.0.1: 973 | version "6.0.1" 974 | resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.1.tgz#cff2ba8d456c3513a04b70c45de4dbcca5b1527c" 975 | integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== 976 | dependencies: 977 | basic-ftp "^5.0.2" 978 | data-uri-to-buffer "^5.0.1" 979 | debug "^4.3.4" 980 | fs-extra "^8.1.0" 981 | 982 | glob-parent@^6.0.2: 983 | version "6.0.2" 984 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 985 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 986 | dependencies: 987 | is-glob "^4.0.3" 988 | 989 | glob@^7.1.3: 990 | version "7.1.6" 991 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 992 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 993 | dependencies: 994 | fs.realpath "^1.0.0" 995 | inflight "^1.0.4" 996 | inherits "2" 997 | minimatch "^3.0.4" 998 | once "^1.3.0" 999 | path-is-absolute "^1.0.0" 1000 | 1001 | globals@^13.19.0: 1002 | version "13.20.0" 1003 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" 1004 | integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== 1005 | dependencies: 1006 | type-fest "^0.20.2" 1007 | 1008 | globalthis@^1.0.3: 1009 | version "1.0.3" 1010 | resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" 1011 | integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== 1012 | dependencies: 1013 | define-properties "^1.1.3" 1014 | 1015 | gopd@^1.0.1: 1016 | version "1.0.1" 1017 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 1018 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 1019 | dependencies: 1020 | get-intrinsic "^1.1.3" 1021 | 1022 | got@^9.6.0: 1023 | version "9.6.0" 1024 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 1025 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 1026 | dependencies: 1027 | "@sindresorhus/is" "^0.14.0" 1028 | "@szmarczak/http-timer" "^1.1.2" 1029 | cacheable-request "^6.0.0" 1030 | decompress-response "^3.3.0" 1031 | duplexer3 "^0.1.4" 1032 | get-stream "^4.1.0" 1033 | lowercase-keys "^1.0.1" 1034 | mimic-response "^1.0.1" 1035 | p-cancelable "^1.0.0" 1036 | to-readable-stream "^1.0.0" 1037 | url-parse-lax "^3.0.0" 1038 | 1039 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 1040 | version "4.2.3" 1041 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 1042 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== 1043 | 1044 | graphemer@^1.4.0: 1045 | version "1.4.0" 1046 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 1047 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1048 | 1049 | has-bigints@^1.0.1: 1050 | version "1.0.1" 1051 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" 1052 | integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== 1053 | 1054 | has-bigints@^1.0.2: 1055 | version "1.0.2" 1056 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" 1057 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 1058 | 1059 | has-flag@^4.0.0: 1060 | version "4.0.0" 1061 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1062 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1063 | 1064 | has-property-descriptors@^1.0.0: 1065 | version "1.0.0" 1066 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 1067 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 1068 | dependencies: 1069 | get-intrinsic "^1.1.1" 1070 | 1071 | has-proto@^1.0.1: 1072 | version "1.0.1" 1073 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" 1074 | integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== 1075 | 1076 | has-symbols@^1.0.1: 1077 | version "1.0.1" 1078 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 1079 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 1080 | 1081 | has-symbols@^1.0.2: 1082 | version "1.0.2" 1083 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 1084 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 1085 | 1086 | has-symbols@^1.0.3: 1087 | version "1.0.3" 1088 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1089 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1090 | 1091 | has-tostringtag@^1.0.0: 1092 | version "1.0.0" 1093 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 1094 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 1095 | dependencies: 1096 | has-symbols "^1.0.2" 1097 | 1098 | has@^1.0.3: 1099 | version "1.0.3" 1100 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1101 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1102 | dependencies: 1103 | function-bind "^1.1.1" 1104 | 1105 | http-cache-semantics@^4.0.0: 1106 | version "4.1.1" 1107 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" 1108 | integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== 1109 | 1110 | http-proxy-agent@^7.0.0: 1111 | version "7.0.0" 1112 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" 1113 | integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== 1114 | dependencies: 1115 | agent-base "^7.1.0" 1116 | debug "^4.3.4" 1117 | 1118 | https-proxy-agent@^7.0.0: 1119 | version "7.0.0" 1120 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz#75cb70d04811685667183b31ab158d006750418a" 1121 | integrity sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw== 1122 | dependencies: 1123 | agent-base "^7.0.2" 1124 | debug "4" 1125 | 1126 | ignore@^5.1.1: 1127 | version "5.1.8" 1128 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" 1129 | integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== 1130 | 1131 | ignore@^5.2.0: 1132 | version "5.2.4" 1133 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" 1134 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== 1135 | 1136 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1137 | version "3.2.2" 1138 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" 1139 | integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== 1140 | dependencies: 1141 | parent-module "^1.0.0" 1142 | resolve-from "^4.0.0" 1143 | 1144 | imurmurhash@^0.1.4: 1145 | version "0.1.4" 1146 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1147 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1148 | 1149 | inflight@^1.0.4: 1150 | version "1.0.6" 1151 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1152 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1153 | dependencies: 1154 | once "^1.3.0" 1155 | wrappy "1" 1156 | 1157 | inherits@2: 1158 | version "2.0.4" 1159 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1160 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1161 | 1162 | ini@~1.3.0: 1163 | version "1.3.5" 1164 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1165 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 1166 | 1167 | internal-slot@^1.0.3: 1168 | version "1.0.3" 1169 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" 1170 | integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== 1171 | dependencies: 1172 | get-intrinsic "^1.1.0" 1173 | has "^1.0.3" 1174 | side-channel "^1.0.4" 1175 | 1176 | internal-slot@^1.0.5: 1177 | version "1.0.5" 1178 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" 1179 | integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== 1180 | dependencies: 1181 | get-intrinsic "^1.2.0" 1182 | has "^1.0.3" 1183 | side-channel "^1.0.4" 1184 | 1185 | ip@^1.1.5: 1186 | version "1.1.8" 1187 | resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" 1188 | integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== 1189 | 1190 | ip@^2.0.0: 1191 | version "2.0.0" 1192 | resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" 1193 | integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== 1194 | 1195 | is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: 1196 | version "3.0.2" 1197 | resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" 1198 | integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== 1199 | dependencies: 1200 | call-bind "^1.0.2" 1201 | get-intrinsic "^1.2.0" 1202 | is-typed-array "^1.1.10" 1203 | 1204 | is-bigint@^1.0.1: 1205 | version "1.0.4" 1206 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" 1207 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 1208 | dependencies: 1209 | has-bigints "^1.0.1" 1210 | 1211 | is-boolean-object@^1.1.0: 1212 | version "1.1.2" 1213 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" 1214 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 1215 | dependencies: 1216 | call-bind "^1.0.2" 1217 | has-tostringtag "^1.0.0" 1218 | 1219 | is-callable@^1.1.3, is-callable@^1.2.7: 1220 | version "1.2.7" 1221 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 1222 | integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 1223 | 1224 | is-callable@^1.1.4: 1225 | version "1.2.2" 1226 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" 1227 | integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== 1228 | 1229 | is-callable@^1.2.4: 1230 | version "1.2.4" 1231 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" 1232 | integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== 1233 | 1234 | is-core-module@^2.1.0: 1235 | version "2.2.0" 1236 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" 1237 | integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== 1238 | dependencies: 1239 | has "^1.0.3" 1240 | 1241 | is-core-module@^2.11.0: 1242 | version "2.12.1" 1243 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" 1244 | integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== 1245 | dependencies: 1246 | has "^1.0.3" 1247 | 1248 | is-date-object@^1.0.1: 1249 | version "1.0.2" 1250 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 1251 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 1252 | 1253 | is-docker@^2.0.0: 1254 | version "2.1.1" 1255 | resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" 1256 | integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== 1257 | 1258 | is-docker@^2.1.1: 1259 | version "2.2.1" 1260 | resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" 1261 | integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== 1262 | 1263 | is-extglob@^2.1.1: 1264 | version "2.1.1" 1265 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1266 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1267 | 1268 | is-glob@^4.0.0: 1269 | version "4.0.1" 1270 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1271 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1272 | dependencies: 1273 | is-extglob "^2.1.1" 1274 | 1275 | is-glob@^4.0.3: 1276 | version "4.0.3" 1277 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1278 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1279 | dependencies: 1280 | is-extglob "^2.1.1" 1281 | 1282 | is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: 1283 | version "2.0.2" 1284 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" 1285 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 1286 | 1287 | is-number-object@^1.0.4: 1288 | version "1.0.6" 1289 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" 1290 | integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== 1291 | dependencies: 1292 | has-tostringtag "^1.0.0" 1293 | 1294 | is-path-inside@^3.0.3: 1295 | version "3.0.3" 1296 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1297 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1298 | 1299 | is-regex@^1.1.4: 1300 | version "1.1.4" 1301 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 1302 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 1303 | dependencies: 1304 | call-bind "^1.0.2" 1305 | has-tostringtag "^1.0.0" 1306 | 1307 | is-shared-array-buffer@^1.0.1: 1308 | version "1.0.1" 1309 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" 1310 | integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== 1311 | 1312 | is-shared-array-buffer@^1.0.2: 1313 | version "1.0.2" 1314 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" 1315 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 1316 | dependencies: 1317 | call-bind "^1.0.2" 1318 | 1319 | is-string@^1.0.5: 1320 | version "1.0.5" 1321 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 1322 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 1323 | 1324 | is-string@^1.0.7: 1325 | version "1.0.7" 1326 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" 1327 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 1328 | dependencies: 1329 | has-tostringtag "^1.0.0" 1330 | 1331 | is-symbol@^1.0.2: 1332 | version "1.0.3" 1333 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1334 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 1335 | dependencies: 1336 | has-symbols "^1.0.1" 1337 | 1338 | is-symbol@^1.0.3: 1339 | version "1.0.4" 1340 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 1341 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 1342 | dependencies: 1343 | has-symbols "^1.0.2" 1344 | 1345 | is-typed-array@^1.1.10, is-typed-array@^1.1.9: 1346 | version "1.1.10" 1347 | resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" 1348 | integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== 1349 | dependencies: 1350 | available-typed-arrays "^1.0.5" 1351 | call-bind "^1.0.2" 1352 | for-each "^0.3.3" 1353 | gopd "^1.0.1" 1354 | has-tostringtag "^1.0.0" 1355 | 1356 | is-weakref@^1.0.1, is-weakref@^1.0.2: 1357 | version "1.0.2" 1358 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" 1359 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1360 | dependencies: 1361 | call-bind "^1.0.2" 1362 | 1363 | is-wsl@^2.2.0: 1364 | version "2.2.0" 1365 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" 1366 | integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== 1367 | dependencies: 1368 | is-docker "^2.0.0" 1369 | 1370 | isexe@^2.0.0: 1371 | version "2.0.0" 1372 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1373 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1374 | 1375 | js-base64@^3.7.5: 1376 | version "3.7.5" 1377 | resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.5.tgz#21e24cf6b886f76d6f5f165bfcd69cc55b9e3fca" 1378 | integrity sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA== 1379 | 1380 | js-yaml@^4.1.0: 1381 | version "4.1.0" 1382 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1383 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1384 | dependencies: 1385 | argparse "^2.0.1" 1386 | 1387 | json-buffer@3.0.0: 1388 | version "3.0.0" 1389 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 1390 | integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== 1391 | 1392 | json-schema-traverse@^0.4.1: 1393 | version "0.4.1" 1394 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1395 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1396 | 1397 | json-stable-stringify-without-jsonify@^1.0.1: 1398 | version "1.0.1" 1399 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1400 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1401 | 1402 | json5@^1.0.2: 1403 | version "1.0.2" 1404 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" 1405 | integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== 1406 | dependencies: 1407 | minimist "^1.2.0" 1408 | 1409 | jsonfile@^4.0.0: 1410 | version "4.0.0" 1411 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1412 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 1413 | optionalDependencies: 1414 | graceful-fs "^4.1.6" 1415 | 1416 | jsonfile@^6.0.1: 1417 | version "6.0.1" 1418 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" 1419 | integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== 1420 | dependencies: 1421 | universalify "^1.0.0" 1422 | optionalDependencies: 1423 | graceful-fs "^4.1.6" 1424 | 1425 | keyv@^3.0.0: 1426 | version "3.1.0" 1427 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 1428 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 1429 | dependencies: 1430 | json-buffer "3.0.0" 1431 | 1432 | kleur@^3.0.3: 1433 | version "3.0.3" 1434 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" 1435 | integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== 1436 | 1437 | latest-version@^5.1.0: 1438 | version "5.1.0" 1439 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 1440 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 1441 | dependencies: 1442 | package-json "^6.3.0" 1443 | 1444 | levn@^0.4.1: 1445 | version "0.4.1" 1446 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1447 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1448 | dependencies: 1449 | prelude-ls "^1.2.1" 1450 | type-check "~0.4.0" 1451 | 1452 | levn@~0.3.0: 1453 | version "0.3.0" 1454 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1455 | integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== 1456 | dependencies: 1457 | prelude-ls "~1.1.2" 1458 | type-check "~0.3.2" 1459 | 1460 | locate-path@^6.0.0: 1461 | version "6.0.0" 1462 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1463 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1464 | dependencies: 1465 | p-locate "^5.0.0" 1466 | 1467 | lodash.flatmap@^4.5.0: 1468 | version "4.5.0" 1469 | resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e" 1470 | integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4= 1471 | 1472 | lodash.merge@^4.6.2: 1473 | version "4.6.2" 1474 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1475 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1476 | 1477 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 1478 | version "1.0.1" 1479 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1480 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1481 | 1482 | lowercase-keys@^2.0.0: 1483 | version "2.0.0" 1484 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 1485 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 1486 | 1487 | lru-cache@^7.14.1: 1488 | version "7.18.3" 1489 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" 1490 | integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== 1491 | 1492 | mimic-response@^1.0.0, mimic-response@^1.0.1: 1493 | version "1.0.1" 1494 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1495 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1496 | 1497 | minimatch@^3.0.4: 1498 | version "3.0.4" 1499 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1500 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1501 | dependencies: 1502 | brace-expansion "^1.1.7" 1503 | 1504 | minimatch@^3.0.5, minimatch@^3.1.2: 1505 | version "3.1.2" 1506 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1507 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1508 | dependencies: 1509 | brace-expansion "^1.1.7" 1510 | 1511 | minimist@^1.2.0: 1512 | version "1.2.5" 1513 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1514 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1515 | 1516 | minimist@^1.2.6: 1517 | version "1.2.8" 1518 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 1519 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 1520 | 1521 | moment@^2.24.0: 1522 | version "2.24.0" 1523 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" 1524 | integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== 1525 | 1526 | ms@2.1.2, ms@^2.1.1: 1527 | version "2.1.2" 1528 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1529 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1530 | 1531 | natural-compare@^1.4.0: 1532 | version "1.4.0" 1533 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1534 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1535 | 1536 | netmask@^2.0.2: 1537 | version "2.0.2" 1538 | resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" 1539 | integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== 1540 | 1541 | node-abort-controller@^3.1.1: 1542 | version "3.1.1" 1543 | resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" 1544 | integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== 1545 | 1546 | normalize-url@^4.1.0: 1547 | version "4.5.1" 1548 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 1549 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 1550 | 1551 | object-inspect@^1.11.0, object-inspect@^1.9.0: 1552 | version "1.12.0" 1553 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" 1554 | integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== 1555 | 1556 | object-inspect@^1.12.3: 1557 | version "1.12.3" 1558 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" 1559 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 1560 | 1561 | object-keys@^1.0.12, object-keys@^1.1.1: 1562 | version "1.1.1" 1563 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1564 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1565 | 1566 | object.assign@^4.1.2: 1567 | version "4.1.2" 1568 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" 1569 | integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== 1570 | dependencies: 1571 | call-bind "^1.0.0" 1572 | define-properties "^1.1.3" 1573 | has-symbols "^1.0.1" 1574 | object-keys "^1.1.1" 1575 | 1576 | object.assign@^4.1.4: 1577 | version "4.1.4" 1578 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" 1579 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== 1580 | dependencies: 1581 | call-bind "^1.0.2" 1582 | define-properties "^1.1.4" 1583 | has-symbols "^1.0.3" 1584 | object-keys "^1.1.1" 1585 | 1586 | object.values@^1.1.6: 1587 | version "1.1.6" 1588 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" 1589 | integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== 1590 | dependencies: 1591 | call-bind "^1.0.2" 1592 | define-properties "^1.1.4" 1593 | es-abstract "^1.20.4" 1594 | 1595 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1596 | version "1.4.0" 1597 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1598 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1599 | dependencies: 1600 | wrappy "1" 1601 | 1602 | open@^8.4.2: 1603 | version "8.4.2" 1604 | resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" 1605 | integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== 1606 | dependencies: 1607 | define-lazy-prop "^2.0.0" 1608 | is-docker "^2.1.1" 1609 | is-wsl "^2.2.0" 1610 | 1611 | optionator@^0.8.1: 1612 | version "0.8.3" 1613 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1614 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1615 | dependencies: 1616 | deep-is "~0.1.3" 1617 | fast-levenshtein "~2.0.6" 1618 | levn "~0.3.0" 1619 | prelude-ls "~1.1.2" 1620 | type-check "~0.3.2" 1621 | word-wrap "~1.2.3" 1622 | 1623 | optionator@^0.9.1: 1624 | version "0.9.1" 1625 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1626 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1627 | dependencies: 1628 | deep-is "^0.1.3" 1629 | fast-levenshtein "^2.0.6" 1630 | levn "^0.4.1" 1631 | prelude-ls "^1.2.1" 1632 | type-check "^0.4.0" 1633 | word-wrap "^1.2.3" 1634 | 1635 | p-cancelable@^1.0.0: 1636 | version "1.1.0" 1637 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1638 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1639 | 1640 | p-limit@^3.0.2: 1641 | version "3.1.0" 1642 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1643 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1644 | dependencies: 1645 | yocto-queue "^0.1.0" 1646 | 1647 | p-locate@^5.0.0: 1648 | version "5.0.0" 1649 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1650 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1651 | dependencies: 1652 | p-limit "^3.0.2" 1653 | 1654 | pac-proxy-agent@^6.0.3: 1655 | version "6.0.3" 1656 | resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-6.0.3.tgz#61042187093b67aa7dd05b41e4ec7c241a27c428" 1657 | integrity sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ== 1658 | dependencies: 1659 | agent-base "^7.0.2" 1660 | debug "^4.3.4" 1661 | get-uri "^6.0.1" 1662 | http-proxy-agent "^7.0.0" 1663 | https-proxy-agent "^7.0.0" 1664 | pac-resolver "^6.0.1" 1665 | socks-proxy-agent "^8.0.1" 1666 | 1667 | pac-resolver@^6.0.1: 1668 | version "6.0.1" 1669 | resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-6.0.1.tgz#319c182d3db4e6782e79519cb4dd1dda46579292" 1670 | integrity sha512-dg497MhVT7jZegPRuOScQ/z0aV/5WR0gTdRu1md+Irs9J9o+ls5jIuxjo1WfaTG+eQQkxyn5HMGvWK+w7EIBkQ== 1671 | dependencies: 1672 | degenerator "^4.0.1" 1673 | ip "^1.1.5" 1674 | netmask "^2.0.2" 1675 | 1676 | package-json@^6.3.0: 1677 | version "6.5.0" 1678 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 1679 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 1680 | dependencies: 1681 | got "^9.6.0" 1682 | registry-auth-token "^4.0.0" 1683 | registry-url "^5.0.0" 1684 | semver "^6.2.0" 1685 | 1686 | parent-module@^1.0.0: 1687 | version "1.0.1" 1688 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1689 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1690 | dependencies: 1691 | callsites "^3.0.0" 1692 | 1693 | path-exists@^4.0.0: 1694 | version "4.0.0" 1695 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1696 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1697 | 1698 | path-is-absolute@^1.0.0: 1699 | version "1.0.1" 1700 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1701 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1702 | 1703 | path-key@^3.1.0: 1704 | version "3.1.1" 1705 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1706 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1707 | 1708 | path-parse@^1.0.6: 1709 | version "1.0.6" 1710 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1711 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1712 | 1713 | path-parse@^1.0.7: 1714 | version "1.0.7" 1715 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1716 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1717 | 1718 | pixiv-api-client@^0.25.0: 1719 | version "0.25.0" 1720 | resolved "https://registry.yarnpkg.com/pixiv-api-client/-/pixiv-api-client-0.25.0.tgz#26edee36262bfd8477bfb804a1e2e66c89cfc3b0" 1721 | integrity sha512-IWo0HwnxUEH9OtQ3qEZsKUbpdStRSomS18Gx4UV5JT1fj/E/opYGZMgpcdzC1+3ouBJECV1evzt0778S2RJ+/Q== 1722 | dependencies: 1723 | axios "^0.21.1" 1724 | blueimp-md5 "^2.12.0" 1725 | moment "^2.24.0" 1726 | qs "^6.2.1" 1727 | 1728 | prelude-ls@^1.2.1: 1729 | version "1.2.1" 1730 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1731 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1732 | 1733 | prelude-ls@~1.1.2: 1734 | version "1.1.2" 1735 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1736 | integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== 1737 | 1738 | prepend-http@^2.0.0: 1739 | version "2.0.0" 1740 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1741 | integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== 1742 | 1743 | prompts@^2.4.2: 1744 | version "2.4.2" 1745 | resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" 1746 | integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== 1747 | dependencies: 1748 | kleur "^3.0.3" 1749 | sisteransi "^1.0.5" 1750 | 1751 | proxy-agent@^6.2.1: 1752 | version "6.2.1" 1753 | resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.2.1.tgz#062df6609a4012fd1c108974865599b61e77abde" 1754 | integrity sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q== 1755 | dependencies: 1756 | agent-base "^7.0.2" 1757 | debug "^4.3.4" 1758 | http-proxy-agent "^7.0.0" 1759 | https-proxy-agent "^7.0.0" 1760 | lru-cache "^7.14.1" 1761 | pac-proxy-agent "^6.0.3" 1762 | proxy-from-env "^1.1.0" 1763 | socks-proxy-agent "^8.0.1" 1764 | 1765 | proxy-from-env@^1.1.0: 1766 | version "1.1.0" 1767 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 1768 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1769 | 1770 | pump@^3.0.0: 1771 | version "3.0.0" 1772 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1773 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1774 | dependencies: 1775 | end-of-stream "^1.1.0" 1776 | once "^1.3.1" 1777 | 1778 | punycode@^2.1.0: 1779 | version "2.1.1" 1780 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1781 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1782 | 1783 | qs@^6.2.1: 1784 | version "6.9.3" 1785 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" 1786 | integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== 1787 | 1788 | queue-microtask@^1.2.2: 1789 | version "1.2.3" 1790 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1791 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1792 | 1793 | rc@1.2.8, rc@^1.2.8: 1794 | version "1.2.8" 1795 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1796 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1797 | dependencies: 1798 | deep-extend "^0.6.0" 1799 | ini "~1.3.0" 1800 | minimist "^1.2.0" 1801 | strip-json-comments "~2.0.1" 1802 | 1803 | readline-sync@^1.4.10: 1804 | version "1.4.10" 1805 | resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" 1806 | integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== 1807 | 1808 | regexp.prototype.flags@^1.4.3: 1809 | version "1.5.0" 1810 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" 1811 | integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== 1812 | dependencies: 1813 | call-bind "^1.0.2" 1814 | define-properties "^1.2.0" 1815 | functions-have-names "^1.2.3" 1816 | 1817 | regexpp@^3.0.0: 1818 | version "3.1.0" 1819 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" 1820 | integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 1821 | 1822 | register-protocol-win32@^1.1.0: 1823 | version "1.1.0" 1824 | resolved "https://registry.yarnpkg.com/register-protocol-win32/-/register-protocol-win32-1.1.0.tgz#ac961c69caaa2d609eec368aa0e4daf81a2dfee3" 1825 | integrity sha1-rJYcacqqLWCe7DaKoOTa+Bot/uM= 1826 | dependencies: 1827 | winreg "^1.1.1" 1828 | 1829 | registry-auth-token@^4.0.0: 1830 | version "4.2.2" 1831 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" 1832 | integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== 1833 | dependencies: 1834 | rc "1.2.8" 1835 | 1836 | registry-url@^5.0.0: 1837 | version "5.1.0" 1838 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 1839 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1840 | dependencies: 1841 | rc "^1.2.8" 1842 | 1843 | resolve-from@^4.0.0: 1844 | version "4.0.0" 1845 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1846 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1847 | 1848 | resolve@^1.10.1: 1849 | version "1.19.0" 1850 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" 1851 | integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== 1852 | dependencies: 1853 | is-core-module "^2.1.0" 1854 | path-parse "^1.0.6" 1855 | 1856 | resolve@^1.22.1: 1857 | version "1.22.2" 1858 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" 1859 | integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== 1860 | dependencies: 1861 | is-core-module "^2.11.0" 1862 | path-parse "^1.0.7" 1863 | supports-preserve-symlinks-flag "^1.0.0" 1864 | 1865 | responselike@^1.0.2: 1866 | version "1.0.2" 1867 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1868 | integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== 1869 | dependencies: 1870 | lowercase-keys "^1.0.0" 1871 | 1872 | reusify@^1.0.4: 1873 | version "1.0.4" 1874 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1875 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1876 | 1877 | rimraf@^3.0.2: 1878 | version "3.0.2" 1879 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1880 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1881 | dependencies: 1882 | glob "^7.1.3" 1883 | 1884 | run-parallel@^1.1.9: 1885 | version "1.2.0" 1886 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1887 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1888 | dependencies: 1889 | queue-microtask "^1.2.2" 1890 | 1891 | safe-regex-test@^1.0.0: 1892 | version "1.0.0" 1893 | resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" 1894 | integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== 1895 | dependencies: 1896 | call-bind "^1.0.2" 1897 | get-intrinsic "^1.1.3" 1898 | is-regex "^1.1.4" 1899 | 1900 | semver@^6.1.0, semver@^6.2.0, semver@^6.3.0: 1901 | version "6.3.0" 1902 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1903 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1904 | 1905 | shebang-command@^2.0.0: 1906 | version "2.0.0" 1907 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1908 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1909 | dependencies: 1910 | shebang-regex "^3.0.0" 1911 | 1912 | shebang-regex@^3.0.0: 1913 | version "3.0.0" 1914 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1915 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1916 | 1917 | side-channel@^1.0.4: 1918 | version "1.0.4" 1919 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1920 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1921 | dependencies: 1922 | call-bind "^1.0.0" 1923 | get-intrinsic "^1.0.2" 1924 | object-inspect "^1.9.0" 1925 | 1926 | sisteransi@^1.0.5: 1927 | version "1.0.5" 1928 | resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" 1929 | integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== 1930 | 1931 | smart-buffer@^4.2.0: 1932 | version "4.2.0" 1933 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" 1934 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 1935 | 1936 | socks-proxy-agent@^8.0.1: 1937 | version "8.0.1" 1938 | resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" 1939 | integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== 1940 | dependencies: 1941 | agent-base "^7.0.1" 1942 | debug "^4.3.4" 1943 | socks "^2.7.1" 1944 | 1945 | socks@^2.7.1: 1946 | version "2.7.1" 1947 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" 1948 | integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== 1949 | dependencies: 1950 | ip "^2.0.0" 1951 | smart-buffer "^4.2.0" 1952 | 1953 | source-map@~0.6.1: 1954 | version "0.6.1" 1955 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1956 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1957 | 1958 | string.prototype.trim@^1.2.7: 1959 | version "1.2.7" 1960 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" 1961 | integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== 1962 | dependencies: 1963 | call-bind "^1.0.2" 1964 | define-properties "^1.1.4" 1965 | es-abstract "^1.20.4" 1966 | 1967 | string.prototype.trimend@^1.0.4: 1968 | version "1.0.4" 1969 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" 1970 | integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== 1971 | dependencies: 1972 | call-bind "^1.0.2" 1973 | define-properties "^1.1.3" 1974 | 1975 | string.prototype.trimend@^1.0.6: 1976 | version "1.0.6" 1977 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" 1978 | integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== 1979 | dependencies: 1980 | call-bind "^1.0.2" 1981 | define-properties "^1.1.4" 1982 | es-abstract "^1.20.4" 1983 | 1984 | string.prototype.trimstart@^1.0.4: 1985 | version "1.0.4" 1986 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" 1987 | integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== 1988 | dependencies: 1989 | call-bind "^1.0.2" 1990 | define-properties "^1.1.3" 1991 | 1992 | string.prototype.trimstart@^1.0.6: 1993 | version "1.0.6" 1994 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" 1995 | integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== 1996 | dependencies: 1997 | call-bind "^1.0.2" 1998 | define-properties "^1.1.4" 1999 | es-abstract "^1.20.4" 2000 | 2001 | strip-ansi@^6.0.1: 2002 | version "6.0.1" 2003 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2004 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2005 | dependencies: 2006 | ansi-regex "^5.0.1" 2007 | 2008 | strip-bom@^3.0.0: 2009 | version "3.0.0" 2010 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2011 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 2012 | 2013 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 2014 | version "3.1.1" 2015 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 2016 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2017 | 2018 | strip-json-comments@~2.0.1: 2019 | version "2.0.1" 2020 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2021 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2022 | 2023 | supports-color@^7.1.0: 2024 | version "7.2.0" 2025 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2026 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2027 | dependencies: 2028 | has-flag "^4.0.0" 2029 | 2030 | supports-preserve-symlinks-flag@^1.0.0: 2031 | version "1.0.0" 2032 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2033 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2034 | 2035 | text-table@^0.2.0: 2036 | version "0.2.0" 2037 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2038 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 2039 | 2040 | to-readable-stream@^1.0.0: 2041 | version "1.0.0" 2042 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 2043 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 2044 | 2045 | tsconfig-paths@^3.14.1: 2046 | version "3.14.2" 2047 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" 2048 | integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== 2049 | dependencies: 2050 | "@types/json5" "^0.0.29" 2051 | json5 "^1.0.2" 2052 | minimist "^1.2.6" 2053 | strip-bom "^3.0.0" 2054 | 2055 | tslib@^2.0.1: 2056 | version "2.5.2" 2057 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" 2058 | integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== 2059 | 2060 | type-check@^0.4.0, type-check@~0.4.0: 2061 | version "0.4.0" 2062 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2063 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2064 | dependencies: 2065 | prelude-ls "^1.2.1" 2066 | 2067 | type-check@~0.3.2: 2068 | version "0.3.2" 2069 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2070 | integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== 2071 | dependencies: 2072 | prelude-ls "~1.1.2" 2073 | 2074 | type-fest@^0.20.2: 2075 | version "0.20.2" 2076 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2077 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2078 | 2079 | typed-array-length@^1.0.4: 2080 | version "1.0.4" 2081 | resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" 2082 | integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== 2083 | dependencies: 2084 | call-bind "^1.0.2" 2085 | for-each "^0.3.3" 2086 | is-typed-array "^1.1.9" 2087 | 2088 | unbox-primitive@^1.0.1: 2089 | version "1.0.1" 2090 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" 2091 | integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== 2092 | dependencies: 2093 | function-bind "^1.1.1" 2094 | has-bigints "^1.0.1" 2095 | has-symbols "^1.0.2" 2096 | which-boxed-primitive "^1.0.2" 2097 | 2098 | unbox-primitive@^1.0.2: 2099 | version "1.0.2" 2100 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" 2101 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 2102 | dependencies: 2103 | call-bind "^1.0.2" 2104 | has-bigints "^1.0.2" 2105 | has-symbols "^1.0.3" 2106 | which-boxed-primitive "^1.0.2" 2107 | 2108 | universalify@^0.1.0: 2109 | version "0.1.2" 2110 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 2111 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 2112 | 2113 | universalify@^1.0.0: 2114 | version "1.0.0" 2115 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" 2116 | integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== 2117 | 2118 | universalify@^2.0.0: 2119 | version "2.0.0" 2120 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 2121 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 2122 | 2123 | uri-js@^4.2.2: 2124 | version "4.4.0" 2125 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" 2126 | integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== 2127 | dependencies: 2128 | punycode "^2.1.0" 2129 | 2130 | url-parse-lax@^3.0.0: 2131 | version "3.0.0" 2132 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 2133 | integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== 2134 | dependencies: 2135 | prepend-http "^2.0.0" 2136 | 2137 | vm2@^3.9.17: 2138 | version "3.9.19" 2139 | resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" 2140 | integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== 2141 | dependencies: 2142 | acorn "^8.7.0" 2143 | acorn-walk "^8.2.0" 2144 | 2145 | which-boxed-primitive@^1.0.2: 2146 | version "1.0.2" 2147 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 2148 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 2149 | dependencies: 2150 | is-bigint "^1.0.1" 2151 | is-boolean-object "^1.1.0" 2152 | is-number-object "^1.0.4" 2153 | is-string "^1.0.5" 2154 | is-symbol "^1.0.3" 2155 | 2156 | which-typed-array@^1.1.9: 2157 | version "1.1.9" 2158 | resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" 2159 | integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== 2160 | dependencies: 2161 | available-typed-arrays "^1.0.5" 2162 | call-bind "^1.0.2" 2163 | for-each "^0.3.3" 2164 | gopd "^1.0.1" 2165 | has-tostringtag "^1.0.0" 2166 | is-typed-array "^1.1.10" 2167 | 2168 | which@^2.0.1: 2169 | version "2.0.2" 2170 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2171 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2172 | dependencies: 2173 | isexe "^2.0.0" 2174 | 2175 | winreg@^1.1.1: 2176 | version "1.2.4" 2177 | resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b" 2178 | integrity sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs= 2179 | 2180 | word-wrap@^1.2.3, word-wrap@~1.2.3: 2181 | version "1.2.3" 2182 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 2183 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 2184 | 2185 | wrappy@1: 2186 | version "1.0.2" 2187 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2188 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2189 | 2190 | yesno@^0.4.0: 2191 | version "0.4.0" 2192 | resolved "https://registry.yarnpkg.com/yesno/-/yesno-0.4.0.tgz#5d674f14d339f0bd4b0edc47f899612c74fcd895" 2193 | integrity sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA== 2194 | 2195 | yocto-queue@^0.1.0: 2196 | version "0.1.0" 2197 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2198 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2199 | --------------------------------------------------------------------------------