├── .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 | 
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 | 
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 | 
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 |
--------------------------------------------------------------------------------