├── .build.yml ├── .github └── workflows │ └── release.yml ├── .gitignore ├── .npmrc ├── Dockerfile ├── LICENSE ├── README.md ├── build ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── mstile-150x150.png ├── safari-pinned-tab.svg ├── site.webmanifest └── static │ ├── css │ └── main.css │ ├── img │ ├── invidious-logo-dark.svg │ └── invidious-logo-light.svg │ └── js │ ├── main.js │ ├── main.min.js │ └── main.min.js.map ├── jsconfig.json ├── package-lock.json ├── package.json └── src ├── assets └── img │ ├── invidious-logo-dark.svg │ └── invidious-logo-light.svg ├── build.js ├── footer.pug ├── header.pug ├── index.pug ├── js-licenses.pug ├── main.js └── main.sass /.build.yml: -------------------------------------------------------------------------------- 1 | image: ubuntu/20.10 2 | packages: 3 | - runc 4 | - podman 5 | sources: 6 | - https://git.sr.ht/~cadence/invidious-redirect 7 | secrets: 8 | - dea6a8f9-aba8-4ecc-8ce7-bc4707b30a96 9 | tasks: 10 | - build: | 11 | cd invidious-redirect 12 | podman build -t quay.io/invidious/invidious-redirect:latest . 13 | - push: podman push quay.io/invidious/invidious-redirect:latest 14 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Build and release container 2 | 3 | on: 4 | push: 5 | branches: 6 | - "master" 7 | 8 | jobs: 9 | release: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v2 16 | 17 | - name: Set up QEMU 18 | uses: docker/setup-qemu-action@v1 19 | 20 | - name: Set up Docker Buildx 21 | uses: docker/setup-buildx-action@v1 22 | 23 | - name: Login to registry 24 | uses: docker/login-action@v1 25 | with: 26 | registry: quay.io 27 | username: ${{ secrets.QUAY_USERNAME }} 28 | password: ${{ secrets.QUAY_PASSWORD }} 29 | 30 | - name: Build and push 31 | uses: docker/build-push-action@v2 32 | with: 33 | push: true 34 | tags: quay.io/invidious/invidious-redirect:latest 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .vscode 3 | *~ 4 | \#*# 5 | build/index.html 6 | build/js-licenses.html 7 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | loglevel=silent 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:14.5.0-alpine as build 2 | WORKDIR /app 3 | COPY . . 4 | RUN npm install 5 | RUN npm run build 6 | 7 | FROM nginx:alpine as app 8 | # fix nginx root location 9 | RUN sed -i 's|index index.html index.htm;|try_files $uri /index.html;|g' /etc/nginx/conf.d/default.conf 10 | COPY --from=build /app/build/ /usr/share/nginx/html/ 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU AFFERO GENERAL PUBLIC LICENSE 2 | Version 3, 19 November 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 Affero General Public License is a free, copyleft license for 11 | software and other kinds of works, specifically designed to ensure 12 | cooperation with the community in the case of network server software. 13 | 14 | The licenses for most software and other practical works are designed 15 | to take away your freedom to share and change the works. By contrast, 16 | our General Public Licenses are intended to guarantee your freedom to 17 | share and change all versions of a program--to make sure it remains free 18 | software for all its users. 19 | 20 | When we speak of free software, we are referring to freedom, not 21 | price. Our General Public Licenses are designed to make sure that you 22 | have the freedom to distribute copies of free software (and charge for 23 | them if you wish), that you receive source code or can get it if you 24 | want it, that you can change the software or use pieces of it in new 25 | free programs, and that you know you can do these things. 26 | 27 | Developers that use our General Public Licenses protect your rights 28 | with two steps: (1) assert copyright on the software, and (2) offer 29 | you this License which gives you legal permission to copy, distribute 30 | and/or modify the software. 31 | 32 | A secondary benefit of defending all users' freedom is that 33 | improvements made in alternate versions of the program, if they 34 | receive widespread use, become available for other developers to 35 | incorporate. Many developers of free software are heartened and 36 | encouraged by the resulting cooperation. However, in the case of 37 | software used on network servers, this result may fail to come about. 38 | The GNU General Public License permits making a modified version and 39 | letting the public access it on a server without ever releasing its 40 | source code to the public. 41 | 42 | The GNU Affero General Public License is designed specifically to 43 | ensure that, in such cases, the modified source code becomes available 44 | to the community. It requires the operator of a network server to 45 | provide the source code of the modified version running there to the 46 | users of that server. Therefore, public use of a modified version, on 47 | a publicly accessible server, gives the public access to the source 48 | code of the modified version. 49 | 50 | An older license, called the Affero General Public License and 51 | published by Affero, was designed to accomplish similar goals. This is 52 | a different license, not a version of the Affero GPL, but Affero has 53 | released a new version of the Affero GPL which permits relicensing under 54 | this license. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | TERMS AND CONDITIONS 60 | 61 | 0. Definitions. 62 | 63 | "This License" refers to version 3 of the GNU Affero General Public License. 64 | 65 | "Copyright" also means copyright-like laws that apply to other kinds of 66 | works, such as semiconductor masks. 67 | 68 | "The Program" refers to any copyrightable work licensed under this 69 | License. Each licensee is addressed as "you". "Licensees" and 70 | "recipients" may be individuals or organizations. 71 | 72 | To "modify" a work means to copy from or adapt all or part of the work 73 | in a fashion requiring copyright permission, other than the making of an 74 | exact copy. The resulting work is called a "modified version" of the 75 | earlier work or a work "based on" the earlier work. 76 | 77 | A "covered work" means either the unmodified Program or a work based 78 | on the Program. 79 | 80 | To "propagate" a work means to do anything with it that, without 81 | permission, would make you directly or secondarily liable for 82 | infringement under applicable copyright law, except executing it on a 83 | computer or modifying a private copy. Propagation includes copying, 84 | distribution (with or without modification), making available to the 85 | public, and in some countries other activities as well. 86 | 87 | To "convey" a work means any kind of propagation that enables other 88 | parties to make or receive copies. Mere interaction with a user through 89 | a computer network, with no transfer of a copy, is not conveying. 90 | 91 | An interactive user interface displays "Appropriate Legal Notices" 92 | to the extent that it includes a convenient and prominently visible 93 | feature that (1) displays an appropriate copyright notice, and (2) 94 | tells the user that there is no warranty for the work (except to the 95 | extent that warranties are provided), that licensees may convey the 96 | work under this License, and how to view a copy of this License. If 97 | the interface presents a list of user commands or options, such as a 98 | menu, a prominent item in the list meets this criterion. 99 | 100 | 1. Source Code. 101 | 102 | The "source code" for a work means the preferred form of the work 103 | for making modifications to it. "Object code" means any non-source 104 | form of a work. 105 | 106 | A "Standard Interface" means an interface that either is an official 107 | standard defined by a recognized standards body, or, in the case of 108 | interfaces specified for a particular programming language, one that 109 | is widely used among developers working in that language. 110 | 111 | The "System Libraries" of an executable work include anything, other 112 | than the work as a whole, that (a) is included in the normal form of 113 | packaging a Major Component, but which is not part of that Major 114 | Component, and (b) serves only to enable use of the work with that 115 | Major Component, or to implement a Standard Interface for which an 116 | implementation is available to the public in source code form. A 117 | "Major Component", in this context, means a major essential component 118 | (kernel, window system, and so on) of the specific operating system 119 | (if any) on which the executable work runs, or a compiler used to 120 | produce the work, or an object code interpreter used to run it. 121 | 122 | The "Corresponding Source" for a work in object code form means all 123 | the source code needed to generate, install, and (for an executable 124 | work) run the object code and to modify the work, including scripts to 125 | control those activities. However, it does not include the work's 126 | System Libraries, or general-purpose tools or generally available free 127 | programs which are used unmodified in performing those activities but 128 | which are not part of the work. For example, Corresponding Source 129 | includes interface definition files associated with source files for 130 | the work, and the source code for shared libraries and dynamically 131 | linked subprograms that the work is specifically designed to require, 132 | such as by intimate data communication or control flow between those 133 | subprograms and other parts of the work. 134 | 135 | The Corresponding Source need not include anything that users 136 | can regenerate automatically from other parts of the Corresponding 137 | Source. 138 | 139 | The Corresponding Source for a work in source code form is that 140 | same work. 141 | 142 | 2. Basic Permissions. 143 | 144 | All rights granted under this License are granted for the term of 145 | copyright on the Program, and are irrevocable provided the stated 146 | conditions are met. This License explicitly affirms your unlimited 147 | permission to run the unmodified Program. The output from running a 148 | covered work is covered by this License only if the output, given its 149 | content, constitutes a covered work. This License acknowledges your 150 | rights of fair use or other equivalent, as provided by copyright law. 151 | 152 | You may make, run and propagate covered works that you do not 153 | convey, without conditions so long as your license otherwise remains 154 | in force. You may convey covered works to others for the sole purpose 155 | of having them make modifications exclusively for you, or provide you 156 | with facilities for running those works, provided that you comply with 157 | the terms of this License in conveying all material for which you do 158 | not control copyright. Those thus making or running the covered works 159 | for you must do so exclusively on your behalf, under your direction 160 | and control, on terms that prohibit them from making any copies of 161 | your copyrighted material outside their relationship with you. 162 | 163 | Conveying under any other circumstances is permitted solely under 164 | the conditions stated below. Sublicensing is not allowed; section 10 165 | makes it unnecessary. 166 | 167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 168 | 169 | No covered work shall be deemed part of an effective technological 170 | measure under any applicable law fulfilling obligations under article 171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 172 | similar laws prohibiting or restricting circumvention of such 173 | measures. 174 | 175 | When you convey a covered work, you waive any legal power to forbid 176 | circumvention of technological measures to the extent such circumvention 177 | is effected by exercising rights under this License with respect to 178 | the covered work, and you disclaim any intention to limit operation or 179 | modification of the work as a means of enforcing, against the work's 180 | users, your or third parties' legal rights to forbid circumvention of 181 | technological measures. 182 | 183 | 4. Conveying Verbatim Copies. 184 | 185 | You may convey verbatim copies of the Program's source code as you 186 | receive it, in any medium, provided that you conspicuously and 187 | appropriately publish on each copy an appropriate copyright notice; 188 | keep intact all notices stating that this License and any 189 | non-permissive terms added in accord with section 7 apply to the code; 190 | keep intact all notices of the absence of any warranty; and give all 191 | recipients a copy of this License along with the Program. 192 | 193 | You may charge any price or no price for each copy that you convey, 194 | and you may offer support or warranty protection for a fee. 195 | 196 | 5. Conveying Modified Source Versions. 197 | 198 | You may convey a work based on the Program, or the modifications to 199 | produce it from the Program, in the form of source code under the 200 | terms of section 4, provided that you also meet all of these conditions: 201 | 202 | a) The work must carry prominent notices stating that you modified 203 | it, and giving a relevant date. 204 | 205 | b) The work must carry prominent notices stating that it is 206 | released under this License and any conditions added under section 207 | 7. This requirement modifies the requirement in section 4 to 208 | "keep intact all notices". 209 | 210 | c) You must license the entire work, as a whole, under this 211 | License to anyone who comes into possession of a copy. This 212 | License will therefore apply, along with any applicable section 7 213 | additional terms, to the whole of the work, and all its parts, 214 | regardless of how they are packaged. This License gives no 215 | permission to license the work in any other way, but it does not 216 | invalidate such permission if you have separately received it. 217 | 218 | d) If the work has interactive user interfaces, each must display 219 | Appropriate Legal Notices; however, if the Program has interactive 220 | interfaces that do not display Appropriate Legal Notices, your 221 | work need not make them do so. 222 | 223 | A compilation of a covered work with other separate and independent 224 | works, which are not by their nature extensions of the covered work, 225 | and which are not combined with it such as to form a larger program, 226 | in or on a volume of a storage or distribution medium, is called an 227 | "aggregate" if the compilation and its resulting copyright are not 228 | used to limit the access or legal rights of the compilation's users 229 | beyond what the individual works permit. Inclusion of a covered work 230 | in an aggregate does not cause this License to apply to the other 231 | parts of the aggregate. 232 | 233 | 6. Conveying Non-Source Forms. 234 | 235 | You may convey a covered work in object code form under the terms 236 | of sections 4 and 5, provided that you also convey the 237 | machine-readable Corresponding Source under the terms of this License, 238 | in one of these ways: 239 | 240 | a) Convey the object code in, or embodied in, a physical product 241 | (including a physical distribution medium), accompanied by the 242 | Corresponding Source fixed on a durable physical medium 243 | customarily used for software interchange. 244 | 245 | b) Convey the object code in, or embodied in, a physical product 246 | (including a physical distribution medium), accompanied by a 247 | written offer, valid for at least three years and valid for as 248 | long as you offer spare parts or customer support for that product 249 | model, to give anyone who possesses the object code either (1) a 250 | copy of the Corresponding Source for all the software in the 251 | product that is covered by this License, on a durable physical 252 | medium customarily used for software interchange, for a price no 253 | more than your reasonable cost of physically performing this 254 | conveying of source, or (2) access to copy the 255 | Corresponding Source from a network server at no charge. 256 | 257 | c) Convey individual copies of the object code with a copy of the 258 | written offer to provide the Corresponding Source. This 259 | alternative is allowed only occasionally and noncommercially, and 260 | only if you received the object code with such an offer, in accord 261 | with subsection 6b. 262 | 263 | d) Convey the object code by offering access from a designated 264 | place (gratis or for a charge), and offer equivalent access to the 265 | Corresponding Source in the same way through the same place at no 266 | further charge. You need not require recipients to copy the 267 | Corresponding Source along with the object code. If the place to 268 | copy the object code is a network server, the Corresponding Source 269 | may be on a different server (operated by you or a third party) 270 | that supports equivalent copying facilities, provided you maintain 271 | clear directions next to the object code saying where to find the 272 | Corresponding Source. Regardless of what server hosts the 273 | Corresponding Source, you remain obligated to ensure that it is 274 | available for as long as needed to satisfy these requirements. 275 | 276 | e) Convey the object code using peer-to-peer transmission, provided 277 | you inform other peers where the object code and Corresponding 278 | Source of the work are being offered to the general public at no 279 | charge under subsection 6d. 280 | 281 | A separable portion of the object code, whose source code is excluded 282 | from the Corresponding Source as a System Library, need not be 283 | included in conveying the object code work. 284 | 285 | A "User Product" is either (1) a "consumer product", which means any 286 | tangible personal property which is normally used for personal, family, 287 | or household purposes, or (2) anything designed or sold for incorporation 288 | into a dwelling. In determining whether a product is a consumer product, 289 | doubtful cases shall be resolved in favor of coverage. For a particular 290 | product received by a particular user, "normally used" refers to a 291 | typical or common use of that class of product, regardless of the status 292 | of the particular user or of the way in which the particular user 293 | actually uses, or expects or is expected to use, the product. A product 294 | is a consumer product regardless of whether the product has substantial 295 | commercial, industrial or non-consumer uses, unless such uses represent 296 | the only significant mode of use of the product. 297 | 298 | "Installation Information" for a User Product means any methods, 299 | procedures, authorization keys, or other information required to install 300 | and execute modified versions of a covered work in that User Product from 301 | a modified version of its Corresponding Source. The information must 302 | suffice to ensure that the continued functioning of the modified object 303 | code is in no case prevented or interfered with solely because 304 | modification has been made. 305 | 306 | If you convey an object code work under this section in, or with, or 307 | specifically for use in, a User Product, and the conveying occurs as 308 | part of a transaction in which the right of possession and use of the 309 | User Product is transferred to the recipient in perpetuity or for a 310 | fixed term (regardless of how the transaction is characterized), the 311 | Corresponding Source conveyed under this section must be accompanied 312 | by the Installation Information. But this requirement does not apply 313 | if neither you nor any third party retains the ability to install 314 | modified object code on the User Product (for example, the work has 315 | been installed in ROM). 316 | 317 | The requirement to provide Installation Information does not include a 318 | requirement to continue to provide support service, warranty, or updates 319 | for a work that has been modified or installed by the recipient, or for 320 | the User Product in which it has been modified or installed. Access to a 321 | network may be denied when the modification itself materially and 322 | adversely affects the operation of the network or violates the rules and 323 | protocols for communication across the network. 324 | 325 | Corresponding Source conveyed, and Installation Information provided, 326 | in accord with this section must be in a format that is publicly 327 | documented (and with an implementation available to the public in 328 | source code form), and must require no special password or key for 329 | unpacking, reading or copying. 330 | 331 | 7. Additional Terms. 332 | 333 | "Additional permissions" are terms that supplement the terms of this 334 | License by making exceptions from one or more of its conditions. 335 | Additional permissions that are applicable to the entire Program shall 336 | be treated as though they were included in this License, to the extent 337 | that they are valid under applicable law. If additional permissions 338 | apply only to part of the Program, that part may be used separately 339 | under those permissions, but the entire Program remains governed by 340 | this License without regard to the additional permissions. 341 | 342 | When you convey a copy of a covered work, you may at your option 343 | remove any additional permissions from that copy, or from any part of 344 | it. (Additional permissions may be written to require their own 345 | removal in certain cases when you modify the work.) You may place 346 | additional permissions on material, added by you to a covered work, 347 | for which you have or can give appropriate copyright permission. 348 | 349 | Notwithstanding any other provision of this License, for material you 350 | add to a covered work, you may (if authorized by the copyright holders of 351 | that material) supplement the terms of this License with terms: 352 | 353 | a) Disclaiming warranty or limiting liability differently from the 354 | terms of sections 15 and 16 of this License; or 355 | 356 | b) Requiring preservation of specified reasonable legal notices or 357 | author attributions in that material or in the Appropriate Legal 358 | Notices displayed by works containing it; or 359 | 360 | c) Prohibiting misrepresentation of the origin of that material, or 361 | requiring that modified versions of such material be marked in 362 | reasonable ways as different from the original version; or 363 | 364 | d) Limiting the use for publicity purposes of names of licensors or 365 | authors of the material; or 366 | 367 | e) Declining to grant rights under trademark law for use of some 368 | trade names, trademarks, or service marks; or 369 | 370 | f) Requiring indemnification of licensors and authors of that 371 | material by anyone who conveys the material (or modified versions of 372 | it) with contractual assumptions of liability to the recipient, for 373 | any liability that these contractual assumptions directly impose on 374 | those licensors and authors. 375 | 376 | All other non-permissive additional terms are considered "further 377 | restrictions" within the meaning of section 10. If the Program as you 378 | received it, or any part of it, contains a notice stating that it is 379 | governed by this License along with a term that is a further 380 | restriction, you may remove that term. If a license document contains 381 | a further restriction but permits relicensing or conveying under this 382 | License, you may add to a covered work material governed by the terms 383 | of that license document, provided that the further restriction does 384 | not survive such relicensing or conveying. 385 | 386 | If you add terms to a covered work in accord with this section, you 387 | must place, in the relevant source files, a statement of the 388 | additional terms that apply to those files, or a notice indicating 389 | where to find the applicable terms. 390 | 391 | Additional terms, permissive or non-permissive, may be stated in the 392 | form of a separately written license, or stated as exceptions; 393 | the above requirements apply either way. 394 | 395 | 8. Termination. 396 | 397 | You may not propagate or modify a covered work except as expressly 398 | provided under this License. Any attempt otherwise to propagate or 399 | modify it is void, and will automatically terminate your rights under 400 | this License (including any patent licenses granted under the third 401 | paragraph of section 11). 402 | 403 | However, if you cease all violation of this License, then your 404 | license from a particular copyright holder is reinstated (a) 405 | provisionally, unless and until the copyright holder explicitly and 406 | finally terminates your license, and (b) permanently, if the copyright 407 | holder fails to notify you of the violation by some reasonable means 408 | prior to 60 days after the cessation. 409 | 410 | Moreover, your license from a particular copyright holder is 411 | reinstated permanently if the copyright holder notifies you of the 412 | violation by some reasonable means, this is the first time you have 413 | received notice of violation of this License (for any work) from that 414 | copyright holder, and you cure the violation prior to 30 days after 415 | your receipt of the notice. 416 | 417 | Termination of your rights under this section does not terminate the 418 | licenses of parties who have received copies or rights from you under 419 | this License. If your rights have been terminated and not permanently 420 | reinstated, you do not qualify to receive new licenses for the same 421 | material under section 10. 422 | 423 | 9. Acceptance Not Required for Having Copies. 424 | 425 | You are not required to accept this License in order to receive or 426 | run a copy of the Program. Ancillary propagation of a covered work 427 | occurring solely as a consequence of using peer-to-peer transmission 428 | to receive a copy likewise does not require acceptance. However, 429 | nothing other than this License grants you permission to propagate or 430 | modify any covered work. These actions infringe copyright if you do 431 | not accept this License. Therefore, by modifying or propagating a 432 | covered work, you indicate your acceptance of this License to do so. 433 | 434 | 10. Automatic Licensing of Downstream Recipients. 435 | 436 | Each time you convey a covered work, the recipient automatically 437 | receives a license from the original licensors, to run, modify and 438 | propagate that work, subject to this License. You are not responsible 439 | for enforcing compliance by third parties with this License. 440 | 441 | An "entity transaction" is a transaction transferring control of an 442 | organization, or substantially all assets of one, or subdividing an 443 | organization, or merging organizations. If propagation of a covered 444 | work results from an entity transaction, each party to that 445 | transaction who receives a copy of the work also receives whatever 446 | licenses to the work the party's predecessor in interest had or could 447 | give under the previous paragraph, plus a right to possession of the 448 | Corresponding Source of the work from the predecessor in interest, if 449 | the predecessor has it or can get it with reasonable efforts. 450 | 451 | You may not impose any further restrictions on the exercise of the 452 | rights granted or affirmed under this License. For example, you may 453 | not impose a license fee, royalty, or other charge for exercise of 454 | rights granted under this License, and you may not initiate litigation 455 | (including a cross-claim or counterclaim in a lawsuit) alleging that 456 | any patent claim is infringed by making, using, selling, offering for 457 | sale, or importing the Program or any portion of it. 458 | 459 | 11. Patents. 460 | 461 | A "contributor" is a copyright holder who authorizes use under this 462 | License of the Program or a work on which the Program is based. The 463 | work thus licensed is called the contributor's "contributor version". 464 | 465 | A contributor's "essential patent claims" are all patent claims 466 | owned or controlled by the contributor, whether already acquired or 467 | hereafter acquired, that would be infringed by some manner, permitted 468 | by this License, of making, using, or selling its contributor version, 469 | but do not include claims that would be infringed only as a 470 | consequence of further modification of the contributor version. For 471 | purposes of this definition, "control" includes the right to grant 472 | patent sublicenses in a manner consistent with the requirements of 473 | this License. 474 | 475 | Each contributor grants you a non-exclusive, worldwide, royalty-free 476 | patent license under the contributor's essential patent claims, to 477 | make, use, sell, offer for sale, import and otherwise run, modify and 478 | propagate the contents of its contributor version. 479 | 480 | In the following three paragraphs, a "patent license" is any express 481 | agreement or commitment, however denominated, not to enforce a patent 482 | (such as an express permission to practice a patent or covenant not to 483 | sue for patent infringement). To "grant" such a patent license to a 484 | party means to make such an agreement or commitment not to enforce a 485 | patent against the party. 486 | 487 | If you convey a covered work, knowingly relying on a patent license, 488 | and the Corresponding Source of the work is not available for anyone 489 | to copy, free of charge and under the terms of this License, through a 490 | publicly available network server or other readily accessible means, 491 | then you must either (1) cause the Corresponding Source to be so 492 | available, or (2) arrange to deprive yourself of the benefit of the 493 | patent license for this particular work, or (3) arrange, in a manner 494 | consistent with the requirements of this License, to extend the patent 495 | license to downstream recipients. "Knowingly relying" means you have 496 | actual knowledge that, but for the patent license, your conveying the 497 | covered work in a country, or your recipient's use of the covered work 498 | in a country, would infringe one or more identifiable patents in that 499 | country that you have reason to believe are valid. 500 | 501 | If, pursuant to or in connection with a single transaction or 502 | arrangement, you convey, or propagate by procuring conveyance of, a 503 | covered work, and grant a patent license to some of the parties 504 | receiving the covered work authorizing them to use, propagate, modify 505 | or convey a specific copy of the covered work, then the patent license 506 | you grant is automatically extended to all recipients of the covered 507 | work and works based on it. 508 | 509 | A patent license is "discriminatory" if it does not include within 510 | the scope of its coverage, prohibits the exercise of, or is 511 | conditioned on the non-exercise of one or more of the rights that are 512 | specifically granted under this License. You may not convey a covered 513 | work if you are a party to an arrangement with a third party that is 514 | in the business of distributing software, under which you make payment 515 | to the third party based on the extent of your activity of conveying 516 | the work, and under which the third party grants, to any of the 517 | parties who would receive the covered work from you, a discriminatory 518 | patent license (a) in connection with copies of the covered work 519 | conveyed by you (or copies made from those copies), or (b) primarily 520 | for and in connection with specific products or compilations that 521 | contain the covered work, unless you entered into that arrangement, 522 | or that patent license was granted, prior to 28 March 2007. 523 | 524 | Nothing in this License shall be construed as excluding or limiting 525 | any implied license or other defenses to infringement that may 526 | otherwise be available to you under applicable patent law. 527 | 528 | 12. No Surrender of Others' Freedom. 529 | 530 | If conditions are imposed on you (whether by court order, agreement or 531 | otherwise) that contradict the conditions of this License, they do not 532 | excuse you from the conditions of this License. If you cannot convey a 533 | covered work so as to satisfy simultaneously your obligations under this 534 | License and any other pertinent obligations, then as a consequence you may 535 | not convey it at all. For example, if you agree to terms that obligate you 536 | to collect a royalty for further conveying from those to whom you convey 537 | the Program, the only way you could satisfy both those terms and this 538 | License would be to refrain entirely from conveying the Program. 539 | 540 | 13. Remote Network Interaction; Use with the GNU General Public License. 541 | 542 | Notwithstanding any other provision of this License, if you modify the 543 | Program, your modified version must prominently offer all users 544 | interacting with it remotely through a computer network (if your version 545 | supports such interaction) an opportunity to receive the Corresponding 546 | Source of your version by providing access to the Corresponding Source 547 | from a network server at no charge, through some standard or customary 548 | means of facilitating copying of software. This Corresponding Source 549 | shall include the Corresponding Source for any work covered by version 3 550 | of the GNU General Public License that is incorporated pursuant to the 551 | following paragraph. 552 | 553 | Notwithstanding any other provision of this License, you have 554 | permission to link or combine any covered work with a work licensed 555 | under version 3 of the GNU General Public License into a single 556 | combined work, and to convey the resulting work. The terms of this 557 | License will continue to apply to the part which is the covered work, 558 | but the work with which it is combined will remain governed by version 559 | 3 of the GNU General Public License. 560 | 561 | 14. Revised Versions of this License. 562 | 563 | The Free Software Foundation may publish revised and/or new versions of 564 | the GNU Affero General Public License from time to time. Such new versions 565 | will be similar in spirit to the present version, but may differ in detail to 566 | address new problems or concerns. 567 | 568 | Each version is given a distinguishing version number. If the 569 | Program specifies that a certain numbered version of the GNU Affero General 570 | Public License "or any later version" applies to it, you have the 571 | option of following the terms and conditions either of that numbered 572 | version or of any later version published by the Free Software 573 | Foundation. If the Program does not specify a version number of the 574 | GNU Affero General Public License, you may choose any version ever published 575 | by the Free Software Foundation. 576 | 577 | If the Program specifies that a proxy can decide which future 578 | versions of the GNU Affero General Public License can be used, that proxy's 579 | public statement of acceptance of a version permanently authorizes you 580 | to choose that version for the Program. 581 | 582 | Later license versions may give you additional or different 583 | permissions. However, no additional obligations are imposed on any 584 | author or copyright holder as a result of your choosing to follow a 585 | later version. 586 | 587 | 15. Disclaimer of Warranty. 588 | 589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 596 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 597 | 598 | 16. Limitation of Liability. 599 | 600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 608 | SUCH DAMAGES. 609 | 610 | 17. Interpretation of Sections 15 and 16. 611 | 612 | If the disclaimer of warranty and limitation of liability provided 613 | above cannot be given local legal effect according to their terms, 614 | reviewing courts shall apply local law that most closely approximates 615 | an absolute waiver of all civil liability in connection with the 616 | Program, unless a warranty or assumption of liability accompanies a 617 | copy of the Program in return for a fee. 618 | 619 | END OF TERMS AND CONDITIONS 620 | 621 | How to Apply These Terms to Your New Programs 622 | 623 | If you develop a new program, and you want it to be of the greatest 624 | possible use to the public, the best way to achieve this is to make it 625 | free software which everyone can redistribute and change under these terms. 626 | 627 | To do so, attach the following notices to the program. It is safest 628 | to attach them to the start of each source file to most effectively 629 | state the exclusion of warranty; and each file should have at least 630 | the "copyright" line and a pointer to where the full notice is found. 631 | 632 | 633 | Copyright (C) 634 | 635 | This program is free software: you can redistribute it and/or modify 636 | it under the terms of the GNU Affero General Public License as published by 637 | the Free Software Foundation, either version 3 of the License, or 638 | (at your option) any later version. 639 | 640 | This program is distributed in the hope that it will be useful, 641 | but WITHOUT ANY WARRANTY; without even the implied warranty of 642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 643 | GNU Affero General Public License for more details. 644 | 645 | You should have received a copy of the GNU Affero General Public License 646 | along with this program. If not, see . 647 | 648 | Also add information on how to contact you by electronic and paper mail. 649 | 650 | If your software can interact with users remotely through a computer 651 | network, you should also make sure that it provides a way for users to 652 | get its source. For example, if your program is a web application, its 653 | interface could display a "Source" link that leads users to an archive 654 | of the code. There are many ways you could offer source, and different 655 | solutions will be better for different programs; see section 13 for the 656 | specific requirements. 657 | 658 | You should also get your employer (if you work as a programmer) or school, 659 | if any, to sign a "copyright disclaimer" for the program, if necessary. 660 | For more information on this, and how to apply and follow the GNU AGPL, see 661 | . 662 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # invidious-redirect 2 | 3 | Backstory: https://github.com/iv-org/invidious/issues/1321 4 | 5 | Live: https://redirect.invidious.io/ 6 | 7 | Build Instructions 8 | 9 | ``` 10 | npm install -D 11 | npm run build 12 | ``` 13 | 14 | License: AGPL 3 15 | -------------------------------------------------------------------------------- /build/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iv-org/invidious-redirect/d5e4d97f4f998b8c2512c51ed9961a8d989a7ce0/build/android-chrome-192x192.png -------------------------------------------------------------------------------- /build/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iv-org/invidious-redirect/d5e4d97f4f998b8c2512c51ed9961a8d989a7ce0/build/android-chrome-512x512.png -------------------------------------------------------------------------------- /build/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iv-org/invidious-redirect/d5e4d97f4f998b8c2512c51ed9961a8d989a7ce0/build/apple-touch-icon.png -------------------------------------------------------------------------------- /build/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #2b5797 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /build/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iv-org/invidious-redirect/d5e4d97f4f998b8c2512c51ed9961a8d989a7ce0/build/favicon-16x16.png -------------------------------------------------------------------------------- /build/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iv-org/invidious-redirect/d5e4d97f4f998b8c2512c51ed9961a8d989a7ce0/build/favicon-32x32.png -------------------------------------------------------------------------------- /build/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iv-org/invidious-redirect/d5e4d97f4f998b8c2512c51ed9961a8d989a7ce0/build/favicon.ico -------------------------------------------------------------------------------- /build/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iv-org/invidious-redirect/d5e4d97f4f998b8c2512c51ed9961a8d989a7ce0/build/mstile-150x150.png -------------------------------------------------------------------------------- /build/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 22 | 24 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /build/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Invidious Redirect", 3 | "short_name": "invidious-redirect", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#575757", 17 | "background_color": "#575757", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /build/static/css/main.css: -------------------------------------------------------------------------------- 1 | :root{--bg-primary: #fcf5f4;--bg-secondary: #e9e1df;--bg-tertiary: #cec8c6;--fg-header: #000;--fg-primary: #181818;--fg-dim: #646464;--fg-link: #2664b5;--edge-mark: #aaa;--edge-table: #333}@media(prefers-color-scheme: dark){:root{--bg-primary: #232323;--bg-secondary: #191919;--bg-tertiary: #383838;--fg-header: #fff;--fg-primary: #d9d9d9;--fg-dim: #828282;--fg-link: #529ef5;--edge-mark: #555;--edge-table: #aaa}}body{background-color:var(--bg-primary);color:var(--fg-primary);font-size:20px;margin:0;padding:8px;font-family:sans-serif}a,a:visited{color:var(--fg-link)}noscript{display:block}mark{background-color:var(--bg-tertiary);color:var(--fg-primary);padding:3px 5px;border-radius:4px;border:1px solid var(--edge-mark)}table,td,th{border:1px solid var(--edge-table);border-collapse:collapse}td,th{padding:4px 8px}thead,tr:nth-child(even){background-color:var(--bg-secondary)}footer{font-size:16px;text-align:center;max-width:500px;margin:40px auto}.banner{display:grid;grid-gap:24px;align-items:center;justify-items:center;justify-content:center;padding:20px}@media screen and (min-width: 520px){.banner{grid-template-columns:80px auto}}.banner .logo{width:80px;height:80px;background-size:contain;background-image:url(/static/img/invidious-logo-light.svg?static=25c5cd3acc)}@media(prefers-color-scheme: dark){.banner .logo{background-image:url(/static/img/invidious-logo-dark.svg?static=aa528cbad6)}}.banner h1{color:var(--fg-header);font-size:56px;font-weight:bold;text-transform:uppercase;margin:0;padding:0}.story{margin:40px 0px;text-align:center}@media screen and (min-width: 520px){.story{white-space:pre-line}}.instances-table,.js-license-table{display:flex;justify-content:center}.instances-table table,.js-license-table table{width:100%;max-width:700px}.instances-list{text-align:center}.instances-list .list{margin:0 auto;padding-left:1em;text-align:left;max-width:max-content}.loading-td{text-align:center;padding:20px;background-color:var(--bg-secondary)}.column-center{text-align:center}.health-unknown{color:var(--fg-dim)}.script-warning{margin:0 auto;max-width:max-content;background:#700;color:#fff;padding:4px 20px;border-radius:8px;border:1px solid}.footer-link-list{margin:0;padding:0;justify-content:center;display:flex;list-style-type:none;white-space:pre-wrap;flex-wrap:wrap}.footer-link-list li:not(:first-child)::before{content:" • ";display:inline} -------------------------------------------------------------------------------- /build/static/img/invidious-logo-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /build/static/img/invidious-logo-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /build/static/js/main.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | ;(() => { 4 | const q = s => document.querySelector(s) 5 | const qa = s => document.querySelectorAll(s) 6 | 7 | function createElement(tag, properties = {}, children = []) { 8 | const e = document.createElement(tag) 9 | for (const key of Object.keys(properties)) { 10 | e[key] = properties[key] 11 | } 12 | for (const child of children) { 13 | e.appendChild(child) 14 | } 15 | return e 16 | } 17 | 18 | function shuffle(array) { 19 | for (let i = 0; i < array.length; i++) { 20 | let j = Math.floor(Math.random() * (array.length-i)) + i 21 | ;[array[i], array[j]] = [array[j], array[i]] 22 | } 23 | return array 24 | } 25 | 26 | function request(url, callback) { 27 | const xhr = new XMLHttpRequest() 28 | xhr.addEventListener("readystatechange", () => { 29 | if (xhr.readyState === 4) { 30 | if (xhr.status === 200) { 31 | callback(null, JSON.parse(xhr.response)) 32 | } 33 | } 34 | }) 35 | xhr.open("GET", url) 36 | xhr.send() 37 | } 38 | 39 | const destinationPath = window.location.href.slice(window.location.origin.length) 40 | 41 | q("#watch-on-youtube").href = "https://www.youtube.com" + destinationPath 42 | 43 | for (const e of qa("[data-loading-message]")) { 44 | e.textContent = e.getAttribute("data-loading-message") 45 | } 46 | 47 | request("https://api.invidious.io/instances.json?sort_by=type,health", 48 | /** @param {[string, {monitor: any, flag: string, region: string, stats: any, type: string, uri: string}][]} root */ (err, root) => { 49 | shuffle(root) 50 | root.map(entry => { 51 | const healthKnown = !!entry[1].monitor 52 | return { 53 | name: entry[0], 54 | details: entry[1], 55 | health: +(healthKnown ? entry[1].monitor.dailyRatios[0].ratio : 95), 56 | healthKnown 57 | } 58 | }).filter(entry => { 59 | return entry.details.type === "https" && entry.health > 0 60 | }).sort((a, b) => { 61 | return b.health - a.health 62 | }).forEach(entry => { 63 | let target = entry.details.uri.replace(/\/*$/, "") + destinationPath 64 | const healthUnknown = entry.healthKnown ? "" : "health-unknown " 65 | const health = entry.healthKnown ? entry.health.toFixed(0) : "(unknown)" 66 | q("#instances-tbody").appendChild( 67 | createElement("tr", {}, [ 68 | createElement("td", {textContent: entry.name}), 69 | createElement("td", {className: "column-center "+healthUnknown, textContent: health}), 70 | createElement("td", {className: "column-center"}, [ 71 | createElement("a", {href: target, textContent: "Go →"}) 72 | ]) 73 | ]) 74 | ) 75 | }) 76 | 77 | for (const e of qa(".loading")) { 78 | e.remove() 79 | } 80 | }) 81 | })() 82 | -------------------------------------------------------------------------------- /build/static/js/main.min.js: -------------------------------------------------------------------------------- 1 | "use strict";function _createForOfIteratorHelper(o,allowArrayLike){var it;if(typeof Symbol==="undefined"||o[Symbol.iterator]==null){if(Array.isArray(o)||(it=_unsupportedIterableToArray(o))||allowArrayLike&&o&&typeof o.length==="number"){if(it)o=it;var i=0;var F=function F(){};return{s:F,n:function n(){if(i>=o.length)return{done:true};return{done:false,value:o[i++]}},e:function e(_e){throw _e},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var normalCompletion=true,didErr=false,err;return{s:function s(){it=o[Symbol.iterator]()},n:function n(){var step=it.next();normalCompletion=step.done;return step},e:function e(_e2){didErr=true;err=_e2},f:function f(){try{if(!normalCompletion&&it.return!=null)it.return()}finally{if(didErr)throw err}}}}function _unsupportedIterableToArray(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(o);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i1&&arguments[1]!==undefined?arguments[1]:{};var children=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];var e=document.createElement(tag);for(var _i=0,_Object$keys=Object.keys(properties);_i<_Object$keys.length;_i++){var key=_Object$keys[_i];e[key]=properties[key]}var _iterator=_createForOfIteratorHelper(children),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var child=_step.value;e.appendChild(child)}}catch(err){_iterator.e(err)}finally{_iterator.f()}return e}function shuffle(array){for(var i=0;i0}).sort(function(a,b){return b.health-a.health}).forEach(function(entry){var target=entry.details.uri.replace(/\/*$/,"")+destinationPath;var healthUnknown=entry.healthKnown?"":"health-unknown ";var health=entry.healthKnown?entry.health.toFixed(0):"(unknown)";q("#instances-tbody").appendChild(createElement("tr",{},[createElement("td",{textContent:entry.name}),createElement("td",{className:"column-center "+healthUnknown,textContent:health}),createElement("td",{className:"column-center"},[createElement("a",{href:target,textContent:"Go \u2192"})])]))});var _iterator3=_createForOfIteratorHelper(qa(".loading")),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var e=_step3.value;e.remove()}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}})})(); 2 | //# sourceMappingURL=/static/js/main.min.js.map -------------------------------------------------------------------------------- /build/static/js/main.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["unknown"],"names":["q","s","document","querySelector","qa","querySelectorAll","createElement","tag","properties","children","e","Object","keys","key","child","appendChild","shuffle","array","i","length","j","Math","floor","random","request","url","callback","xhr","XMLHttpRequest","addEventListener","readyState","status","JSON","parse","response","open","send","destinationPath","window","location","href","slice","origin","textContent","getAttribute","err","root","map","entry","healthKnown","monitor","name","details","health","dailyRatios","ratio","filter","type","sort","a","b","forEach","target","uri","replace","healthUnknown","toFixed","className","remove"],"mappings":"AAAA,a,21CAEA,CAAC,CAAC,UAAM,CACP,GAAMA,CAAAA,CAAC,CAAG,QAAJA,CAAAA,CAAI,CAAAC,CAAC,QAAIC,CAAAA,QAAQ,CAACC,aAAT,CAAuBF,CAAvB,CAAJ,CAAX,CACA,GAAMG,CAAAA,EAAE,CAAG,QAALA,CAAAA,EAAK,CAAAH,CAAC,QAAIC,CAAAA,QAAQ,CAACG,gBAAT,CAA0BJ,CAA1B,CAAJ,CAAZ,CAEA,QAASK,CAAAA,aAAT,CAAuBC,GAAvB,CAA4D,IAAhCC,CAAAA,UAAgC,2DAAnB,EAAmB,IAAfC,CAAAA,QAAe,2DAAJ,EAAI,CAC3D,GAAMC,CAAAA,CAAC,CAAGR,QAAQ,CAACI,aAAT,CAAuBC,GAAvB,CAAV,CACA,0BAAkBI,MAAM,CAACC,IAAP,CAAYJ,UAAZ,CAAlB,6BAA2C,CAAtC,GAAMK,CAAAA,GAAG,iBAAT,CACJH,CAAC,CAACG,GAAD,CAAD,CAASL,UAAU,CAACK,GAAD,CACnB,CAJ0D,yCAKvCJ,QALuC,YAK3D,+CAA8B,IAAnBK,CAAAA,KAAmB,aAC7BJ,CAAC,CAACK,WAAF,CAAcD,KAAd,CACA,CAP0D,mDAQ3D,MAAOJ,CAAAA,CACP,CAED,QAASM,CAAAA,OAAT,CAAiBC,KAAjB,CAAwB,CACvB,IAAK,GAAIC,CAAAA,CAAC,CAAG,CAAb,CAAgBA,CAAC,CAAGD,KAAK,CAACE,MAA1B,CAAkCD,CAAC,EAAnC,CAAuC,CACtC,GAAIE,CAAAA,CAAC,CAAGC,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,IAAiBN,KAAK,CAACE,MAAN,CAAaD,CAA9B,CAAX,EAA+CA,CAAvD,CADsC,SAEd,CAACD,KAAK,CAACG,CAAD,CAAN,CAAWH,KAAK,CAACC,CAAD,CAAhB,CAFc,CAEpCD,KAAK,CAACC,CAAD,CAF+B,SAE1BD,KAAK,CAACG,CAAD,CAFqB,QAGtC,CACD,MAAOH,CAAAA,KACP,CAED,QAASO,CAAAA,OAAT,CAAiBC,GAAjB,CAAsBC,QAAtB,CAAgC,CAC/B,GAAMC,CAAAA,GAAG,CAAG,GAAIC,CAAAA,cAAhB,CACAD,GAAG,CAACE,gBAAJ,CAAqB,kBAArB,CAAyC,UAAM,CAC9C,GAAIF,GAAG,CAACG,UAAJ,GAAmB,CAAvB,CAA0B,CACzB,GAAIH,GAAG,CAACI,MAAJ,GAAe,GAAnB,CAAwB,CACvBL,QAAQ,CAAC,IAAD,CAAOM,IAAI,CAACC,KAAL,CAAWN,GAAG,CAACO,QAAf,CAAP,CACR,CACD,CACD,CAND,EAOAP,GAAG,CAACQ,IAAJ,CAAS,KAAT,CAAgBV,GAAhB,EACAE,GAAG,CAACS,IAAJ,EACA,CAED,GAAMC,CAAAA,eAAe,CAAGC,MAAM,CAACC,QAAP,CAAgBC,IAAhB,CAAqBC,KAArB,CAA2BH,MAAM,CAACC,QAAP,CAAgBG,MAAhB,CAAuBvB,MAAlD,CAAxB,CAEAnB,CAAC,CAAC,mBAAD,CAAD,CAAuBwC,IAAvB,CAA8B,0BAA4BH,eAA1D,CAtCO,0CAwCSjC,EAAE,CAAC,wBAAD,CAxCX,aAwCP,kDAA8C,IAAnCM,CAAAA,CAAmC,cAC7CA,CAAC,CAACiC,WAAF,CAAgBjC,CAAC,CAACkC,YAAF,CAAe,sBAAf,CAChB,CA1CM,qDA4CPpB,OAAO,CAAC,6DAAD,CAC8G,SAACqB,GAAD,CAAMC,IAAN,CAAe,CACnI9B,OAAO,CAAC8B,IAAD,CAAP,CACAA,IAAI,CAACC,GAAL,CAAS,SAAAC,KAAK,CAAI,CACjB,GAAMC,CAAAA,WAAW,CAAG,CAAC,CAACD,KAAK,CAAC,CAAD,CAAL,CAASE,OAA/B,CACA,MAAO,CACNC,IAAI,CAAEH,KAAK,CAAC,CAAD,CADL,CAENI,OAAO,CAAEJ,KAAK,CAAC,CAAD,CAFR,CAGNK,MAAM,CAAE,EAAEJ,WAAW,CAAGD,KAAK,CAAC,CAAD,CAAL,CAASE,OAAT,CAAiBI,WAAjB,CAA6B,CAA7B,EAAgCC,KAAnC,CAA2C,EAAxD,CAHF,CAINN,WAAW,CAAXA,WAJM,CAMP,CARD,EAQGO,MARH,CAQU,SAAAR,KAAK,CAAI,CAClB,MAAOA,CAAAA,KAAK,CAACI,OAAN,CAAcK,IAAd,GAAuB,OAAvB,EAAkCT,KAAK,CAACK,MAAN,CAAe,CACxD,CAVD,EAUGK,IAVH,CAUQ,SAACC,CAAD,CAAIC,CAAJ,CAAU,CACjB,MAAOA,CAAAA,CAAC,CAACP,MAAF,CAAWM,CAAC,CAACN,MACpB,CAZD,EAYGQ,OAZH,CAYW,SAAAb,KAAK,CAAI,CACnB,GAAIc,CAAAA,MAAM,CAAGd,KAAK,CAACI,OAAN,CAAcW,GAAd,CAAkBC,OAAlB,CAA0B,MAA1B,CAAkC,EAAlC,EAAwC3B,eAArD,CACA,GAAM4B,CAAAA,aAAa,CAAGjB,KAAK,CAACC,WAAN,CAAoB,EAApB,CAAyB,iBAA/C,CACA,GAAMI,CAAAA,MAAM,CAAGL,KAAK,CAACC,WAAN,CAAoBD,KAAK,CAACK,MAAN,CAAaa,OAAb,CAAqB,CAArB,CAApB,CAA8C,WAA7D,CACAlE,CAAC,CAAC,kBAAD,CAAD,CAAsBe,WAAtB,CACCT,aAAa,CAAC,IAAD,CAAO,EAAP,CAAW,CACvBA,aAAa,CAAC,IAAD,CAAO,CAACqC,WAAW,CAAEK,KAAK,CAACG,IAApB,CAAP,CADU,CAEvB7C,aAAa,CAAC,IAAD,CAAO,CAAC6D,SAAS,CAAE,iBAAiBF,aAA7B,CAA4CtB,WAAW,CAAEU,MAAzD,CAAP,CAFU,CAGvB/C,aAAa,CAAC,IAAD,CAAO,CAAC6D,SAAS,CAAE,eAAZ,CAAP,CAAqC,CACjD7D,aAAa,CAAC,GAAD,CAAM,CAACkC,IAAI,CAAEsB,MAAP,CAAenB,WAAW,CAAE,WAA5B,CAAN,CADoC,CAArC,CAHU,CAAX,CADd,CASA,CAzBD,EAFmI,0CA6BnHvC,EAAE,CAAC,UAAD,CA7BiH,aA6BnI,kDAAgC,IAArBM,CAAAA,CAAqB,cAC/BA,CAAC,CAAC0D,MAAF,EACA,CA/BkI,qDAgCnI,CAjCM,CAkCP,CA9EA","sourcesContent":["\"use strict\";\n\n;(() => {\n\tconst q = s => document.querySelector(s)\n\tconst qa = s => document.querySelectorAll(s)\n\n\tfunction createElement(tag, properties = {}, children = []) {\n\t\tconst e = document.createElement(tag)\n\t\tfor (const key of Object.keys(properties)) {\n\t\t\te[key] = properties[key]\n\t\t}\n\t\tfor (const child of children) {\n\t\t\te.appendChild(child)\n\t\t}\n\t\treturn e\n\t}\n\n\tfunction shuffle(array) {\n\t\tfor (let i = 0; i < array.length; i++) {\n\t\t\tlet j = Math.floor(Math.random() * (array.length-i)) + i\n\t\t\t;[array[i], array[j]] = [array[j], array[i]]\n\t\t}\n\t\treturn array\n\t}\n\n\tfunction request(url, callback) {\n\t\tconst xhr = new XMLHttpRequest()\n\t\txhr.addEventListener(\"readystatechange\", () => {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\tcallback(null, JSON.parse(xhr.response))\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\txhr.open(\"GET\", url)\n\t\txhr.send()\n\t}\n\n\tconst destinationPath = window.location.href.slice(window.location.origin.length)\n\n\tq(\"#watch-on-youtube\").href = \"https://www.youtube.com\" + destinationPath\n\n\tfor (const e of qa(\"[data-loading-message]\")) {\n\t\te.textContent = e.getAttribute(\"data-loading-message\")\n\t}\n\n\trequest(\"https://api.invidious.io/instances.json?sort_by=type,health\",\n\t/** @param {[string, {monitor: any, flag: string, region: string, stats: any, type: string, uri: string}][]} root */ (err, root) => {\n\t\tshuffle(root)\n\t\troot.map(entry => {\n\t\t\tconst healthKnown = !!entry[1].monitor\n\t\t\treturn {\n\t\t\t\tname: entry[0],\n\t\t\t\tdetails: entry[1],\n\t\t\t\thealth: +(healthKnown ? entry[1].monitor.dailyRatios[0].ratio : 95),\n\t\t\t\thealthKnown\n\t\t\t}\n\t\t}).filter(entry => {\n\t\t\treturn entry.details.type === \"https\" && entry.health > 0\n\t\t}).sort((a, b) => {\n\t\t\treturn b.health - a.health\n\t\t}).forEach(entry => {\n\t\t\tlet target = entry.details.uri.replace(/\\/*$/, \"\") + destinationPath\n\t\t\tconst healthUnknown = entry.healthKnown ? \"\" : \"health-unknown \"\n\t\t\tconst health = entry.healthKnown ? entry.health.toFixed(0) : \"(unknown)\"\n\t\t\tq(\"#instances-tbody\").appendChild(\n\t\t\t\tcreateElement(\"tr\", {}, [\n\t\t\t\t\tcreateElement(\"td\", {textContent: entry.name}),\n\t\t\t\t\tcreateElement(\"td\", {className: \"column-center \"+healthUnknown, textContent: health}),\n\t\t\t\t\tcreateElement(\"td\", {className: \"column-center\"}, [\n\t\t\t\t\t\tcreateElement(\"a\", {href: target, textContent: \"Go →\"})\n\t\t\t\t\t])\n\t\t\t\t])\n\t\t\t)\n\t\t})\n\n\t\tfor (const e of qa(\".loading\")) {\n\t\t\te.remove()\n\t\t}\n\t})\n})()\n"]} -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "checkJs": true, 6 | "moduleResolution": "node", 7 | "allowSyntheticDefaultImports": true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "invidious-redirect", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/compat-data": { 17 | "version": "7.11.0", 18 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", 19 | "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", 20 | "dev": true, 21 | "requires": { 22 | "browserslist": "^4.12.0", 23 | "invariant": "^2.2.4", 24 | "semver": "^5.5.0" 25 | } 26 | }, 27 | "@babel/core": { 28 | "version": "7.11.1", 29 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", 30 | "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", 31 | "dev": true, 32 | "requires": { 33 | "@babel/code-frame": "^7.10.4", 34 | "@babel/generator": "^7.11.0", 35 | "@babel/helper-module-transforms": "^7.11.0", 36 | "@babel/helpers": "^7.10.4", 37 | "@babel/parser": "^7.11.1", 38 | "@babel/template": "^7.10.4", 39 | "@babel/traverse": "^7.11.0", 40 | "@babel/types": "^7.11.0", 41 | "convert-source-map": "^1.7.0", 42 | "debug": "^4.1.0", 43 | "gensync": "^1.0.0-beta.1", 44 | "json5": "^2.1.2", 45 | "lodash": "^4.17.19", 46 | "resolve": "^1.3.2", 47 | "semver": "^5.4.1", 48 | "source-map": "^0.5.0" 49 | }, 50 | "dependencies": { 51 | "@babel/parser": { 52 | "version": "7.11.2", 53 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.2.tgz", 54 | "integrity": "sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==", 55 | "dev": true 56 | }, 57 | "debug": { 58 | "version": "4.1.1", 59 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 60 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 61 | "dev": true, 62 | "requires": { 63 | "ms": "^2.1.1" 64 | } 65 | } 66 | } 67 | }, 68 | "@babel/generator": { 69 | "version": "7.11.0", 70 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", 71 | "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", 72 | "dev": true, 73 | "requires": { 74 | "@babel/types": "^7.11.0", 75 | "jsesc": "^2.5.1", 76 | "source-map": "^0.5.0" 77 | } 78 | }, 79 | "@babel/helper-annotate-as-pure": { 80 | "version": "7.10.4", 81 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", 82 | "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", 83 | "dev": true, 84 | "requires": { 85 | "@babel/types": "^7.10.4" 86 | } 87 | }, 88 | "@babel/helper-builder-binary-assignment-operator-visitor": { 89 | "version": "7.10.4", 90 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", 91 | "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", 92 | "dev": true, 93 | "requires": { 94 | "@babel/helper-explode-assignable-expression": "^7.10.4", 95 | "@babel/types": "^7.10.4" 96 | } 97 | }, 98 | "@babel/helper-compilation-targets": { 99 | "version": "7.10.4", 100 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", 101 | "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", 102 | "dev": true, 103 | "requires": { 104 | "@babel/compat-data": "^7.10.4", 105 | "browserslist": "^4.12.0", 106 | "invariant": "^2.2.4", 107 | "levenary": "^1.1.1", 108 | "semver": "^5.5.0" 109 | } 110 | }, 111 | "@babel/helper-create-class-features-plugin": { 112 | "version": "7.10.5", 113 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", 114 | "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", 115 | "dev": true, 116 | "requires": { 117 | "@babel/helper-function-name": "^7.10.4", 118 | "@babel/helper-member-expression-to-functions": "^7.10.5", 119 | "@babel/helper-optimise-call-expression": "^7.10.4", 120 | "@babel/helper-plugin-utils": "^7.10.4", 121 | "@babel/helper-replace-supers": "^7.10.4", 122 | "@babel/helper-split-export-declaration": "^7.10.4" 123 | } 124 | }, 125 | "@babel/helper-create-regexp-features-plugin": { 126 | "version": "7.10.4", 127 | "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", 128 | "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", 129 | "dev": true, 130 | "requires": { 131 | "@babel/helper-annotate-as-pure": "^7.10.4", 132 | "@babel/helper-regex": "^7.10.4", 133 | "regexpu-core": "^4.7.0" 134 | } 135 | }, 136 | "@babel/helper-define-map": { 137 | "version": "7.10.5", 138 | "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", 139 | "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", 140 | "dev": true, 141 | "requires": { 142 | "@babel/helper-function-name": "^7.10.4", 143 | "@babel/types": "^7.10.5", 144 | "lodash": "^4.17.19" 145 | } 146 | }, 147 | "@babel/helper-explode-assignable-expression": { 148 | "version": "7.10.4", 149 | "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", 150 | "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", 151 | "dev": true, 152 | "requires": { 153 | "@babel/traverse": "^7.10.4", 154 | "@babel/types": "^7.10.4" 155 | } 156 | }, 157 | "@babel/helper-function-name": { 158 | "version": "7.10.4", 159 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", 160 | "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", 161 | "dev": true, 162 | "requires": { 163 | "@babel/helper-get-function-arity": "^7.10.4", 164 | "@babel/template": "^7.10.4", 165 | "@babel/types": "^7.10.4" 166 | } 167 | }, 168 | "@babel/helper-get-function-arity": { 169 | "version": "7.10.4", 170 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", 171 | "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", 172 | "dev": true, 173 | "requires": { 174 | "@babel/types": "^7.10.4" 175 | } 176 | }, 177 | "@babel/helper-hoist-variables": { 178 | "version": "7.10.4", 179 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", 180 | "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", 181 | "dev": true, 182 | "requires": { 183 | "@babel/types": "^7.10.4" 184 | } 185 | }, 186 | "@babel/helper-member-expression-to-functions": { 187 | "version": "7.11.0", 188 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", 189 | "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", 190 | "dev": true, 191 | "requires": { 192 | "@babel/types": "^7.11.0" 193 | } 194 | }, 195 | "@babel/helper-module-imports": { 196 | "version": "7.10.4", 197 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", 198 | "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", 199 | "dev": true, 200 | "requires": { 201 | "@babel/types": "^7.10.4" 202 | } 203 | }, 204 | "@babel/helper-module-transforms": { 205 | "version": "7.11.0", 206 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", 207 | "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", 208 | "dev": true, 209 | "requires": { 210 | "@babel/helper-module-imports": "^7.10.4", 211 | "@babel/helper-replace-supers": "^7.10.4", 212 | "@babel/helper-simple-access": "^7.10.4", 213 | "@babel/helper-split-export-declaration": "^7.11.0", 214 | "@babel/template": "^7.10.4", 215 | "@babel/types": "^7.11.0", 216 | "lodash": "^4.17.19" 217 | } 218 | }, 219 | "@babel/helper-optimise-call-expression": { 220 | "version": "7.10.4", 221 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", 222 | "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", 223 | "dev": true, 224 | "requires": { 225 | "@babel/types": "^7.10.4" 226 | } 227 | }, 228 | "@babel/helper-plugin-utils": { 229 | "version": "7.10.4", 230 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", 231 | "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", 232 | "dev": true 233 | }, 234 | "@babel/helper-regex": { 235 | "version": "7.10.5", 236 | "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", 237 | "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", 238 | "dev": true, 239 | "requires": { 240 | "lodash": "^4.17.19" 241 | } 242 | }, 243 | "@babel/helper-remap-async-to-generator": { 244 | "version": "7.10.4", 245 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", 246 | "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", 247 | "dev": true, 248 | "requires": { 249 | "@babel/helper-annotate-as-pure": "^7.10.4", 250 | "@babel/helper-wrap-function": "^7.10.4", 251 | "@babel/template": "^7.10.4", 252 | "@babel/traverse": "^7.10.4", 253 | "@babel/types": "^7.10.4" 254 | } 255 | }, 256 | "@babel/helper-replace-supers": { 257 | "version": "7.10.4", 258 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", 259 | "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", 260 | "dev": true, 261 | "requires": { 262 | "@babel/helper-member-expression-to-functions": "^7.10.4", 263 | "@babel/helper-optimise-call-expression": "^7.10.4", 264 | "@babel/traverse": "^7.10.4", 265 | "@babel/types": "^7.10.4" 266 | } 267 | }, 268 | "@babel/helper-simple-access": { 269 | "version": "7.10.4", 270 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", 271 | "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", 272 | "dev": true, 273 | "requires": { 274 | "@babel/template": "^7.10.4", 275 | "@babel/types": "^7.10.4" 276 | } 277 | }, 278 | "@babel/helper-skip-transparent-expression-wrappers": { 279 | "version": "7.11.0", 280 | "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", 281 | "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", 282 | "dev": true, 283 | "requires": { 284 | "@babel/types": "^7.11.0" 285 | } 286 | }, 287 | "@babel/helper-split-export-declaration": { 288 | "version": "7.11.0", 289 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", 290 | "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", 291 | "dev": true, 292 | "requires": { 293 | "@babel/types": "^7.11.0" 294 | } 295 | }, 296 | "@babel/helper-validator-identifier": { 297 | "version": "7.10.4", 298 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 299 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 300 | "dev": true 301 | }, 302 | "@babel/helper-wrap-function": { 303 | "version": "7.10.4", 304 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", 305 | "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", 306 | "dev": true, 307 | "requires": { 308 | "@babel/helper-function-name": "^7.10.4", 309 | "@babel/template": "^7.10.4", 310 | "@babel/traverse": "^7.10.4", 311 | "@babel/types": "^7.10.4" 312 | } 313 | }, 314 | "@babel/helpers": { 315 | "version": "7.10.4", 316 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", 317 | "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", 318 | "dev": true, 319 | "requires": { 320 | "@babel/template": "^7.10.4", 321 | "@babel/traverse": "^7.10.4", 322 | "@babel/types": "^7.10.4" 323 | } 324 | }, 325 | "@babel/highlight": { 326 | "version": "7.10.4", 327 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 328 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 329 | "dev": true, 330 | "requires": { 331 | "@babel/helper-validator-identifier": "^7.10.4", 332 | "chalk": "^2.0.0", 333 | "js-tokens": "^4.0.0" 334 | } 335 | }, 336 | "@babel/parser": { 337 | "version": "7.11.0", 338 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz", 339 | "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw==", 340 | "dev": true 341 | }, 342 | "@babel/plugin-proposal-async-generator-functions": { 343 | "version": "7.10.5", 344 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", 345 | "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", 346 | "dev": true, 347 | "requires": { 348 | "@babel/helper-plugin-utils": "^7.10.4", 349 | "@babel/helper-remap-async-to-generator": "^7.10.4", 350 | "@babel/plugin-syntax-async-generators": "^7.8.0" 351 | } 352 | }, 353 | "@babel/plugin-proposal-class-properties": { 354 | "version": "7.10.4", 355 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", 356 | "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", 357 | "dev": true, 358 | "requires": { 359 | "@babel/helper-create-class-features-plugin": "^7.10.4", 360 | "@babel/helper-plugin-utils": "^7.10.4" 361 | } 362 | }, 363 | "@babel/plugin-proposal-dynamic-import": { 364 | "version": "7.10.4", 365 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", 366 | "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", 367 | "dev": true, 368 | "requires": { 369 | "@babel/helper-plugin-utils": "^7.10.4", 370 | "@babel/plugin-syntax-dynamic-import": "^7.8.0" 371 | } 372 | }, 373 | "@babel/plugin-proposal-export-namespace-from": { 374 | "version": "7.10.4", 375 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", 376 | "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", 377 | "dev": true, 378 | "requires": { 379 | "@babel/helper-plugin-utils": "^7.10.4", 380 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3" 381 | } 382 | }, 383 | "@babel/plugin-proposal-json-strings": { 384 | "version": "7.10.4", 385 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", 386 | "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", 387 | "dev": true, 388 | "requires": { 389 | "@babel/helper-plugin-utils": "^7.10.4", 390 | "@babel/plugin-syntax-json-strings": "^7.8.0" 391 | } 392 | }, 393 | "@babel/plugin-proposal-logical-assignment-operators": { 394 | "version": "7.11.0", 395 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", 396 | "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", 397 | "dev": true, 398 | "requires": { 399 | "@babel/helper-plugin-utils": "^7.10.4", 400 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" 401 | } 402 | }, 403 | "@babel/plugin-proposal-nullish-coalescing-operator": { 404 | "version": "7.10.4", 405 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", 406 | "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", 407 | "dev": true, 408 | "requires": { 409 | "@babel/helper-plugin-utils": "^7.10.4", 410 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" 411 | } 412 | }, 413 | "@babel/plugin-proposal-numeric-separator": { 414 | "version": "7.10.4", 415 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", 416 | "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", 417 | "dev": true, 418 | "requires": { 419 | "@babel/helper-plugin-utils": "^7.10.4", 420 | "@babel/plugin-syntax-numeric-separator": "^7.10.4" 421 | } 422 | }, 423 | "@babel/plugin-proposal-object-rest-spread": { 424 | "version": "7.11.0", 425 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", 426 | "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", 427 | "dev": true, 428 | "requires": { 429 | "@babel/helper-plugin-utils": "^7.10.4", 430 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 431 | "@babel/plugin-transform-parameters": "^7.10.4" 432 | } 433 | }, 434 | "@babel/plugin-proposal-optional-catch-binding": { 435 | "version": "7.10.4", 436 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", 437 | "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", 438 | "dev": true, 439 | "requires": { 440 | "@babel/helper-plugin-utils": "^7.10.4", 441 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" 442 | } 443 | }, 444 | "@babel/plugin-proposal-optional-chaining": { 445 | "version": "7.11.0", 446 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", 447 | "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", 448 | "dev": true, 449 | "requires": { 450 | "@babel/helper-plugin-utils": "^7.10.4", 451 | "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", 452 | "@babel/plugin-syntax-optional-chaining": "^7.8.0" 453 | } 454 | }, 455 | "@babel/plugin-proposal-private-methods": { 456 | "version": "7.10.4", 457 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", 458 | "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", 459 | "dev": true, 460 | "requires": { 461 | "@babel/helper-create-class-features-plugin": "^7.10.4", 462 | "@babel/helper-plugin-utils": "^7.10.4" 463 | } 464 | }, 465 | "@babel/plugin-proposal-unicode-property-regex": { 466 | "version": "7.10.4", 467 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", 468 | "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", 469 | "dev": true, 470 | "requires": { 471 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 472 | "@babel/helper-plugin-utils": "^7.10.4" 473 | } 474 | }, 475 | "@babel/plugin-syntax-async-generators": { 476 | "version": "7.8.4", 477 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 478 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 479 | "dev": true, 480 | "requires": { 481 | "@babel/helper-plugin-utils": "^7.8.0" 482 | } 483 | }, 484 | "@babel/plugin-syntax-class-properties": { 485 | "version": "7.10.4", 486 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", 487 | "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", 488 | "dev": true, 489 | "requires": { 490 | "@babel/helper-plugin-utils": "^7.10.4" 491 | } 492 | }, 493 | "@babel/plugin-syntax-dynamic-import": { 494 | "version": "7.8.3", 495 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", 496 | "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", 497 | "dev": true, 498 | "requires": { 499 | "@babel/helper-plugin-utils": "^7.8.0" 500 | } 501 | }, 502 | "@babel/plugin-syntax-export-namespace-from": { 503 | "version": "7.8.3", 504 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", 505 | "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", 506 | "dev": true, 507 | "requires": { 508 | "@babel/helper-plugin-utils": "^7.8.3" 509 | } 510 | }, 511 | "@babel/plugin-syntax-json-strings": { 512 | "version": "7.8.3", 513 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 514 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 515 | "dev": true, 516 | "requires": { 517 | "@babel/helper-plugin-utils": "^7.8.0" 518 | } 519 | }, 520 | "@babel/plugin-syntax-logical-assignment-operators": { 521 | "version": "7.10.4", 522 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 523 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 524 | "dev": true, 525 | "requires": { 526 | "@babel/helper-plugin-utils": "^7.10.4" 527 | } 528 | }, 529 | "@babel/plugin-syntax-nullish-coalescing-operator": { 530 | "version": "7.8.3", 531 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 532 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 533 | "dev": true, 534 | "requires": { 535 | "@babel/helper-plugin-utils": "^7.8.0" 536 | } 537 | }, 538 | "@babel/plugin-syntax-numeric-separator": { 539 | "version": "7.10.4", 540 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 541 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 542 | "dev": true, 543 | "requires": { 544 | "@babel/helper-plugin-utils": "^7.10.4" 545 | } 546 | }, 547 | "@babel/plugin-syntax-object-rest-spread": { 548 | "version": "7.8.3", 549 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 550 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 551 | "dev": true, 552 | "requires": { 553 | "@babel/helper-plugin-utils": "^7.8.0" 554 | } 555 | }, 556 | "@babel/plugin-syntax-optional-catch-binding": { 557 | "version": "7.8.3", 558 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 559 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 560 | "dev": true, 561 | "requires": { 562 | "@babel/helper-plugin-utils": "^7.8.0" 563 | } 564 | }, 565 | "@babel/plugin-syntax-optional-chaining": { 566 | "version": "7.8.3", 567 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 568 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 569 | "dev": true, 570 | "requires": { 571 | "@babel/helper-plugin-utils": "^7.8.0" 572 | } 573 | }, 574 | "@babel/plugin-syntax-top-level-await": { 575 | "version": "7.10.4", 576 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", 577 | "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", 578 | "dev": true, 579 | "requires": { 580 | "@babel/helper-plugin-utils": "^7.10.4" 581 | } 582 | }, 583 | "@babel/plugin-transform-arrow-functions": { 584 | "version": "7.10.4", 585 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", 586 | "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", 587 | "dev": true, 588 | "requires": { 589 | "@babel/helper-plugin-utils": "^7.10.4" 590 | } 591 | }, 592 | "@babel/plugin-transform-async-to-generator": { 593 | "version": "7.10.4", 594 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", 595 | "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", 596 | "dev": true, 597 | "requires": { 598 | "@babel/helper-module-imports": "^7.10.4", 599 | "@babel/helper-plugin-utils": "^7.10.4", 600 | "@babel/helper-remap-async-to-generator": "^7.10.4" 601 | } 602 | }, 603 | "@babel/plugin-transform-block-scoped-functions": { 604 | "version": "7.10.4", 605 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", 606 | "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", 607 | "dev": true, 608 | "requires": { 609 | "@babel/helper-plugin-utils": "^7.10.4" 610 | } 611 | }, 612 | "@babel/plugin-transform-block-scoping": { 613 | "version": "7.11.1", 614 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", 615 | "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", 616 | "dev": true, 617 | "requires": { 618 | "@babel/helper-plugin-utils": "^7.10.4" 619 | } 620 | }, 621 | "@babel/plugin-transform-classes": { 622 | "version": "7.10.4", 623 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", 624 | "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", 625 | "dev": true, 626 | "requires": { 627 | "@babel/helper-annotate-as-pure": "^7.10.4", 628 | "@babel/helper-define-map": "^7.10.4", 629 | "@babel/helper-function-name": "^7.10.4", 630 | "@babel/helper-optimise-call-expression": "^7.10.4", 631 | "@babel/helper-plugin-utils": "^7.10.4", 632 | "@babel/helper-replace-supers": "^7.10.4", 633 | "@babel/helper-split-export-declaration": "^7.10.4", 634 | "globals": "^11.1.0" 635 | } 636 | }, 637 | "@babel/plugin-transform-computed-properties": { 638 | "version": "7.10.4", 639 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", 640 | "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", 641 | "dev": true, 642 | "requires": { 643 | "@babel/helper-plugin-utils": "^7.10.4" 644 | } 645 | }, 646 | "@babel/plugin-transform-destructuring": { 647 | "version": "7.10.4", 648 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", 649 | "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", 650 | "dev": true, 651 | "requires": { 652 | "@babel/helper-plugin-utils": "^7.10.4" 653 | } 654 | }, 655 | "@babel/plugin-transform-dotall-regex": { 656 | "version": "7.10.4", 657 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", 658 | "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", 659 | "dev": true, 660 | "requires": { 661 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 662 | "@babel/helper-plugin-utils": "^7.10.4" 663 | } 664 | }, 665 | "@babel/plugin-transform-duplicate-keys": { 666 | "version": "7.10.4", 667 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", 668 | "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", 669 | "dev": true, 670 | "requires": { 671 | "@babel/helper-plugin-utils": "^7.10.4" 672 | } 673 | }, 674 | "@babel/plugin-transform-exponentiation-operator": { 675 | "version": "7.10.4", 676 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", 677 | "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", 678 | "dev": true, 679 | "requires": { 680 | "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", 681 | "@babel/helper-plugin-utils": "^7.10.4" 682 | } 683 | }, 684 | "@babel/plugin-transform-for-of": { 685 | "version": "7.10.4", 686 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", 687 | "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", 688 | "dev": true, 689 | "requires": { 690 | "@babel/helper-plugin-utils": "^7.10.4" 691 | } 692 | }, 693 | "@babel/plugin-transform-function-name": { 694 | "version": "7.10.4", 695 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", 696 | "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", 697 | "dev": true, 698 | "requires": { 699 | "@babel/helper-function-name": "^7.10.4", 700 | "@babel/helper-plugin-utils": "^7.10.4" 701 | } 702 | }, 703 | "@babel/plugin-transform-literals": { 704 | "version": "7.10.4", 705 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", 706 | "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", 707 | "dev": true, 708 | "requires": { 709 | "@babel/helper-plugin-utils": "^7.10.4" 710 | } 711 | }, 712 | "@babel/plugin-transform-member-expression-literals": { 713 | "version": "7.10.4", 714 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", 715 | "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", 716 | "dev": true, 717 | "requires": { 718 | "@babel/helper-plugin-utils": "^7.10.4" 719 | } 720 | }, 721 | "@babel/plugin-transform-modules-amd": { 722 | "version": "7.10.5", 723 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", 724 | "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", 725 | "dev": true, 726 | "requires": { 727 | "@babel/helper-module-transforms": "^7.10.5", 728 | "@babel/helper-plugin-utils": "^7.10.4", 729 | "babel-plugin-dynamic-import-node": "^2.3.3" 730 | } 731 | }, 732 | "@babel/plugin-transform-modules-commonjs": { 733 | "version": "7.10.4", 734 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", 735 | "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", 736 | "dev": true, 737 | "requires": { 738 | "@babel/helper-module-transforms": "^7.10.4", 739 | "@babel/helper-plugin-utils": "^7.10.4", 740 | "@babel/helper-simple-access": "^7.10.4", 741 | "babel-plugin-dynamic-import-node": "^2.3.3" 742 | } 743 | }, 744 | "@babel/plugin-transform-modules-systemjs": { 745 | "version": "7.10.5", 746 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", 747 | "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", 748 | "dev": true, 749 | "requires": { 750 | "@babel/helper-hoist-variables": "^7.10.4", 751 | "@babel/helper-module-transforms": "^7.10.5", 752 | "@babel/helper-plugin-utils": "^7.10.4", 753 | "babel-plugin-dynamic-import-node": "^2.3.3" 754 | } 755 | }, 756 | "@babel/plugin-transform-modules-umd": { 757 | "version": "7.10.4", 758 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", 759 | "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", 760 | "dev": true, 761 | "requires": { 762 | "@babel/helper-module-transforms": "^7.10.4", 763 | "@babel/helper-plugin-utils": "^7.10.4" 764 | } 765 | }, 766 | "@babel/plugin-transform-named-capturing-groups-regex": { 767 | "version": "7.10.4", 768 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", 769 | "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", 770 | "dev": true, 771 | "requires": { 772 | "@babel/helper-create-regexp-features-plugin": "^7.10.4" 773 | } 774 | }, 775 | "@babel/plugin-transform-new-target": { 776 | "version": "7.10.4", 777 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", 778 | "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", 779 | "dev": true, 780 | "requires": { 781 | "@babel/helper-plugin-utils": "^7.10.4" 782 | } 783 | }, 784 | "@babel/plugin-transform-object-super": { 785 | "version": "7.10.4", 786 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", 787 | "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", 788 | "dev": true, 789 | "requires": { 790 | "@babel/helper-plugin-utils": "^7.10.4", 791 | "@babel/helper-replace-supers": "^7.10.4" 792 | } 793 | }, 794 | "@babel/plugin-transform-parameters": { 795 | "version": "7.10.5", 796 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", 797 | "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", 798 | "dev": true, 799 | "requires": { 800 | "@babel/helper-get-function-arity": "^7.10.4", 801 | "@babel/helper-plugin-utils": "^7.10.4" 802 | } 803 | }, 804 | "@babel/plugin-transform-property-literals": { 805 | "version": "7.10.4", 806 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", 807 | "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", 808 | "dev": true, 809 | "requires": { 810 | "@babel/helper-plugin-utils": "^7.10.4" 811 | } 812 | }, 813 | "@babel/plugin-transform-regenerator": { 814 | "version": "7.10.4", 815 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", 816 | "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", 817 | "dev": true, 818 | "requires": { 819 | "regenerator-transform": "^0.14.2" 820 | } 821 | }, 822 | "@babel/plugin-transform-reserved-words": { 823 | "version": "7.10.4", 824 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", 825 | "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", 826 | "dev": true, 827 | "requires": { 828 | "@babel/helper-plugin-utils": "^7.10.4" 829 | } 830 | }, 831 | "@babel/plugin-transform-shorthand-properties": { 832 | "version": "7.10.4", 833 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", 834 | "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", 835 | "dev": true, 836 | "requires": { 837 | "@babel/helper-plugin-utils": "^7.10.4" 838 | } 839 | }, 840 | "@babel/plugin-transform-spread": { 841 | "version": "7.11.0", 842 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", 843 | "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", 844 | "dev": true, 845 | "requires": { 846 | "@babel/helper-plugin-utils": "^7.10.4", 847 | "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" 848 | } 849 | }, 850 | "@babel/plugin-transform-sticky-regex": { 851 | "version": "7.10.4", 852 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", 853 | "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", 854 | "dev": true, 855 | "requires": { 856 | "@babel/helper-plugin-utils": "^7.10.4", 857 | "@babel/helper-regex": "^7.10.4" 858 | } 859 | }, 860 | "@babel/plugin-transform-template-literals": { 861 | "version": "7.10.5", 862 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", 863 | "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", 864 | "dev": true, 865 | "requires": { 866 | "@babel/helper-annotate-as-pure": "^7.10.4", 867 | "@babel/helper-plugin-utils": "^7.10.4" 868 | } 869 | }, 870 | "@babel/plugin-transform-typeof-symbol": { 871 | "version": "7.10.4", 872 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", 873 | "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", 874 | "dev": true, 875 | "requires": { 876 | "@babel/helper-plugin-utils": "^7.10.4" 877 | } 878 | }, 879 | "@babel/plugin-transform-unicode-escapes": { 880 | "version": "7.10.4", 881 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", 882 | "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", 883 | "dev": true, 884 | "requires": { 885 | "@babel/helper-plugin-utils": "^7.10.4" 886 | } 887 | }, 888 | "@babel/plugin-transform-unicode-regex": { 889 | "version": "7.10.4", 890 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", 891 | "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", 892 | "dev": true, 893 | "requires": { 894 | "@babel/helper-create-regexp-features-plugin": "^7.10.4", 895 | "@babel/helper-plugin-utils": "^7.10.4" 896 | } 897 | }, 898 | "@babel/preset-env": { 899 | "version": "7.11.0", 900 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", 901 | "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", 902 | "dev": true, 903 | "requires": { 904 | "@babel/compat-data": "^7.11.0", 905 | "@babel/helper-compilation-targets": "^7.10.4", 906 | "@babel/helper-module-imports": "^7.10.4", 907 | "@babel/helper-plugin-utils": "^7.10.4", 908 | "@babel/plugin-proposal-async-generator-functions": "^7.10.4", 909 | "@babel/plugin-proposal-class-properties": "^7.10.4", 910 | "@babel/plugin-proposal-dynamic-import": "^7.10.4", 911 | "@babel/plugin-proposal-export-namespace-from": "^7.10.4", 912 | "@babel/plugin-proposal-json-strings": "^7.10.4", 913 | "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", 914 | "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", 915 | "@babel/plugin-proposal-numeric-separator": "^7.10.4", 916 | "@babel/plugin-proposal-object-rest-spread": "^7.11.0", 917 | "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", 918 | "@babel/plugin-proposal-optional-chaining": "^7.11.0", 919 | "@babel/plugin-proposal-private-methods": "^7.10.4", 920 | "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", 921 | "@babel/plugin-syntax-async-generators": "^7.8.0", 922 | "@babel/plugin-syntax-class-properties": "^7.10.4", 923 | "@babel/plugin-syntax-dynamic-import": "^7.8.0", 924 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3", 925 | "@babel/plugin-syntax-json-strings": "^7.8.0", 926 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", 927 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", 928 | "@babel/plugin-syntax-numeric-separator": "^7.10.4", 929 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 930 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", 931 | "@babel/plugin-syntax-optional-chaining": "^7.8.0", 932 | "@babel/plugin-syntax-top-level-await": "^7.10.4", 933 | "@babel/plugin-transform-arrow-functions": "^7.10.4", 934 | "@babel/plugin-transform-async-to-generator": "^7.10.4", 935 | "@babel/plugin-transform-block-scoped-functions": "^7.10.4", 936 | "@babel/plugin-transform-block-scoping": "^7.10.4", 937 | "@babel/plugin-transform-classes": "^7.10.4", 938 | "@babel/plugin-transform-computed-properties": "^7.10.4", 939 | "@babel/plugin-transform-destructuring": "^7.10.4", 940 | "@babel/plugin-transform-dotall-regex": "^7.10.4", 941 | "@babel/plugin-transform-duplicate-keys": "^7.10.4", 942 | "@babel/plugin-transform-exponentiation-operator": "^7.10.4", 943 | "@babel/plugin-transform-for-of": "^7.10.4", 944 | "@babel/plugin-transform-function-name": "^7.10.4", 945 | "@babel/plugin-transform-literals": "^7.10.4", 946 | "@babel/plugin-transform-member-expression-literals": "^7.10.4", 947 | "@babel/plugin-transform-modules-amd": "^7.10.4", 948 | "@babel/plugin-transform-modules-commonjs": "^7.10.4", 949 | "@babel/plugin-transform-modules-systemjs": "^7.10.4", 950 | "@babel/plugin-transform-modules-umd": "^7.10.4", 951 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", 952 | "@babel/plugin-transform-new-target": "^7.10.4", 953 | "@babel/plugin-transform-object-super": "^7.10.4", 954 | "@babel/plugin-transform-parameters": "^7.10.4", 955 | "@babel/plugin-transform-property-literals": "^7.10.4", 956 | "@babel/plugin-transform-regenerator": "^7.10.4", 957 | "@babel/plugin-transform-reserved-words": "^7.10.4", 958 | "@babel/plugin-transform-shorthand-properties": "^7.10.4", 959 | "@babel/plugin-transform-spread": "^7.11.0", 960 | "@babel/plugin-transform-sticky-regex": "^7.10.4", 961 | "@babel/plugin-transform-template-literals": "^7.10.4", 962 | "@babel/plugin-transform-typeof-symbol": "^7.10.4", 963 | "@babel/plugin-transform-unicode-escapes": "^7.10.4", 964 | "@babel/plugin-transform-unicode-regex": "^7.10.4", 965 | "@babel/preset-modules": "^0.1.3", 966 | "@babel/types": "^7.11.0", 967 | "browserslist": "^4.12.0", 968 | "core-js-compat": "^3.6.2", 969 | "invariant": "^2.2.2", 970 | "levenary": "^1.1.1", 971 | "semver": "^5.5.0" 972 | } 973 | }, 974 | "@babel/preset-modules": { 975 | "version": "0.1.3", 976 | "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", 977 | "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", 978 | "dev": true, 979 | "requires": { 980 | "@babel/helper-plugin-utils": "^7.0.0", 981 | "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", 982 | "@babel/plugin-transform-dotall-regex": "^7.4.4", 983 | "@babel/types": "^7.4.4", 984 | "esutils": "^2.0.2" 985 | } 986 | }, 987 | "@babel/runtime": { 988 | "version": "7.11.2", 989 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", 990 | "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", 991 | "dev": true, 992 | "requires": { 993 | "regenerator-runtime": "^0.13.4" 994 | } 995 | }, 996 | "@babel/template": { 997 | "version": "7.10.4", 998 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", 999 | "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", 1000 | "dev": true, 1001 | "requires": { 1002 | "@babel/code-frame": "^7.10.4", 1003 | "@babel/parser": "^7.10.4", 1004 | "@babel/types": "^7.10.4" 1005 | } 1006 | }, 1007 | "@babel/traverse": { 1008 | "version": "7.11.0", 1009 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", 1010 | "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", 1011 | "dev": true, 1012 | "requires": { 1013 | "@babel/code-frame": "^7.10.4", 1014 | "@babel/generator": "^7.11.0", 1015 | "@babel/helper-function-name": "^7.10.4", 1016 | "@babel/helper-split-export-declaration": "^7.11.0", 1017 | "@babel/parser": "^7.11.0", 1018 | "@babel/types": "^7.11.0", 1019 | "debug": "^4.1.0", 1020 | "globals": "^11.1.0", 1021 | "lodash": "^4.17.19" 1022 | }, 1023 | "dependencies": { 1024 | "debug": { 1025 | "version": "4.1.1", 1026 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1027 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1028 | "dev": true, 1029 | "requires": { 1030 | "ms": "^2.1.1" 1031 | } 1032 | } 1033 | } 1034 | }, 1035 | "@babel/types": { 1036 | "version": "7.11.0", 1037 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", 1038 | "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", 1039 | "dev": true, 1040 | "requires": { 1041 | "@babel/helper-validator-identifier": "^7.10.4", 1042 | "lodash": "^4.17.19", 1043 | "to-fast-properties": "^2.0.0" 1044 | } 1045 | }, 1046 | "acorn": { 1047 | "version": "7.3.1", 1048 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", 1049 | "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", 1050 | "dev": true 1051 | }, 1052 | "ansi-styles": { 1053 | "version": "3.2.1", 1054 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1055 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1056 | "dev": true, 1057 | "requires": { 1058 | "color-convert": "^1.9.0" 1059 | } 1060 | }, 1061 | "anymatch": { 1062 | "version": "3.1.1", 1063 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 1064 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 1065 | "dev": true, 1066 | "requires": { 1067 | "normalize-path": "^3.0.0", 1068 | "picomatch": "^2.0.4" 1069 | } 1070 | }, 1071 | "asap": { 1072 | "version": "2.0.6", 1073 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 1074 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", 1075 | "dev": true 1076 | }, 1077 | "assert-never": { 1078 | "version": "1.2.1", 1079 | "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", 1080 | "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", 1081 | "dev": true 1082 | }, 1083 | "async": { 1084 | "version": "2.6.3", 1085 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 1086 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 1087 | "dev": true, 1088 | "requires": { 1089 | "lodash": "^4.17.14" 1090 | } 1091 | }, 1092 | "babel-plugin-dynamic-import-node": { 1093 | "version": "2.3.3", 1094 | "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", 1095 | "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", 1096 | "dev": true, 1097 | "requires": { 1098 | "object.assign": "^4.1.0" 1099 | } 1100 | }, 1101 | "babel-walk": { 1102 | "version": "3.0.0-canary-5", 1103 | "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", 1104 | "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", 1105 | "dev": true, 1106 | "requires": { 1107 | "@babel/types": "^7.9.6" 1108 | } 1109 | }, 1110 | "basic-auth": { 1111 | "version": "1.1.0", 1112 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", 1113 | "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=", 1114 | "dev": true 1115 | }, 1116 | "binary-extensions": { 1117 | "version": "2.1.0", 1118 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", 1119 | "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", 1120 | "dev": true 1121 | }, 1122 | "braces": { 1123 | "version": "3.0.2", 1124 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1125 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1126 | "dev": true, 1127 | "requires": { 1128 | "fill-range": "^7.0.1" 1129 | } 1130 | }, 1131 | "browserslist": { 1132 | "version": "4.14.0", 1133 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", 1134 | "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", 1135 | "dev": true, 1136 | "requires": { 1137 | "caniuse-lite": "^1.0.30001111", 1138 | "electron-to-chromium": "^1.3.523", 1139 | "escalade": "^3.0.2", 1140 | "node-releases": "^1.1.60" 1141 | } 1142 | }, 1143 | "caniuse-lite": { 1144 | "version": "1.0.30001112", 1145 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz", 1146 | "integrity": "sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q==", 1147 | "dev": true 1148 | }, 1149 | "chalk": { 1150 | "version": "2.4.2", 1151 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1152 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1153 | "dev": true, 1154 | "requires": { 1155 | "ansi-styles": "^3.2.1", 1156 | "escape-string-regexp": "^1.0.5", 1157 | "supports-color": "^5.3.0" 1158 | } 1159 | }, 1160 | "character-parser": { 1161 | "version": "2.2.0", 1162 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", 1163 | "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", 1164 | "dev": true, 1165 | "requires": { 1166 | "is-regex": "^1.0.3" 1167 | } 1168 | }, 1169 | "chokidar": { 1170 | "version": "3.4.1", 1171 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", 1172 | "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", 1173 | "dev": true, 1174 | "requires": { 1175 | "anymatch": "~3.1.1", 1176 | "braces": "~3.0.2", 1177 | "fsevents": "~2.1.2", 1178 | "glob-parent": "~5.1.0", 1179 | "is-binary-path": "~2.1.0", 1180 | "is-glob": "~4.0.1", 1181 | "normalize-path": "~3.0.0", 1182 | "readdirp": "~3.4.0" 1183 | } 1184 | }, 1185 | "color-convert": { 1186 | "version": "1.9.3", 1187 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1188 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1189 | "dev": true, 1190 | "requires": { 1191 | "color-name": "1.1.3" 1192 | } 1193 | }, 1194 | "color-name": { 1195 | "version": "1.1.3", 1196 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1197 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1198 | "dev": true 1199 | }, 1200 | "colors": { 1201 | "version": "1.4.0", 1202 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 1203 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 1204 | "dev": true 1205 | }, 1206 | "constantinople": { 1207 | "version": "4.0.1", 1208 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", 1209 | "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", 1210 | "dev": true, 1211 | "requires": { 1212 | "@babel/parser": "^7.6.0", 1213 | "@babel/types": "^7.6.1" 1214 | } 1215 | }, 1216 | "convert-source-map": { 1217 | "version": "1.7.0", 1218 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 1219 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 1220 | "dev": true, 1221 | "requires": { 1222 | "safe-buffer": "~5.1.1" 1223 | } 1224 | }, 1225 | "core-js-compat": { 1226 | "version": "3.6.5", 1227 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", 1228 | "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", 1229 | "dev": true, 1230 | "requires": { 1231 | "browserslist": "^4.8.5", 1232 | "semver": "7.0.0" 1233 | }, 1234 | "dependencies": { 1235 | "semver": { 1236 | "version": "7.0.0", 1237 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1238 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1239 | "dev": true 1240 | } 1241 | } 1242 | }, 1243 | "corser": { 1244 | "version": "2.0.1", 1245 | "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", 1246 | "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", 1247 | "dev": true 1248 | }, 1249 | "debug": { 1250 | "version": "3.2.6", 1251 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1252 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1253 | "dev": true, 1254 | "requires": { 1255 | "ms": "^2.1.1" 1256 | } 1257 | }, 1258 | "define-properties": { 1259 | "version": "1.1.3", 1260 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1261 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1262 | "dev": true, 1263 | "requires": { 1264 | "object-keys": "^1.0.12" 1265 | } 1266 | }, 1267 | "doctypes": { 1268 | "version": "1.1.0", 1269 | "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", 1270 | "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", 1271 | "dev": true 1272 | }, 1273 | "ecstatic": { 1274 | "version": "3.3.2", 1275 | "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz", 1276 | "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==", 1277 | "dev": true, 1278 | "requires": { 1279 | "he": "^1.1.1", 1280 | "mime": "^1.6.0", 1281 | "minimist": "^1.1.0", 1282 | "url-join": "^2.0.5" 1283 | } 1284 | }, 1285 | "electron-to-chromium": { 1286 | "version": "1.3.524", 1287 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.524.tgz", 1288 | "integrity": "sha512-ZUvklIBkfXQyA6IeiEss1nfKRICcdB5afAGZAaPGaExdfrkpUu/WWVO+X7QpNnphaVMllXnAcvKnVPdyM+DCPQ==", 1289 | "dev": true 1290 | }, 1291 | "escalade": { 1292 | "version": "3.0.2", 1293 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", 1294 | "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", 1295 | "dev": true 1296 | }, 1297 | "escape-string-regexp": { 1298 | "version": "1.0.5", 1299 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1300 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1301 | "dev": true 1302 | }, 1303 | "esutils": { 1304 | "version": "2.0.3", 1305 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1306 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1307 | "dev": true 1308 | }, 1309 | "eventemitter3": { 1310 | "version": "4.0.4", 1311 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", 1312 | "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", 1313 | "dev": true 1314 | }, 1315 | "fill-range": { 1316 | "version": "7.0.1", 1317 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1318 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1319 | "dev": true, 1320 | "requires": { 1321 | "to-regex-range": "^5.0.1" 1322 | } 1323 | }, 1324 | "follow-redirects": { 1325 | "version": "1.12.1", 1326 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", 1327 | "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==", 1328 | "dev": true 1329 | }, 1330 | "fsevents": { 1331 | "version": "2.1.3", 1332 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 1333 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 1334 | "dev": true, 1335 | "optional": true 1336 | }, 1337 | "function-bind": { 1338 | "version": "1.1.1", 1339 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1340 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1341 | "dev": true 1342 | }, 1343 | "gensync": { 1344 | "version": "1.0.0-beta.1", 1345 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", 1346 | "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", 1347 | "dev": true 1348 | }, 1349 | "glob-parent": { 1350 | "version": "5.1.1", 1351 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 1352 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 1353 | "dev": true, 1354 | "requires": { 1355 | "is-glob": "^4.0.1" 1356 | } 1357 | }, 1358 | "globals": { 1359 | "version": "11.12.0", 1360 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1361 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1362 | "dev": true 1363 | }, 1364 | "has-flag": { 1365 | "version": "3.0.0", 1366 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1367 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1368 | "dev": true 1369 | }, 1370 | "has-symbols": { 1371 | "version": "1.0.1", 1372 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1373 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1374 | "dev": true 1375 | }, 1376 | "he": { 1377 | "version": "1.2.0", 1378 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1379 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1380 | "dev": true 1381 | }, 1382 | "http-proxy": { 1383 | "version": "1.18.1", 1384 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 1385 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 1386 | "dev": true, 1387 | "requires": { 1388 | "eventemitter3": "^4.0.0", 1389 | "follow-redirects": "^1.0.0", 1390 | "requires-port": "^1.0.0" 1391 | } 1392 | }, 1393 | "http-server": { 1394 | "version": "0.12.3", 1395 | "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.12.3.tgz", 1396 | "integrity": "sha512-be0dKG6pni92bRjq0kvExtj/NrrAd28/8fCXkaI/4piTwQMSDSLMhWyW0NI1V+DBI3aa1HMlQu46/HjVLfmugA==", 1397 | "dev": true, 1398 | "requires": { 1399 | "basic-auth": "^1.0.3", 1400 | "colors": "^1.4.0", 1401 | "corser": "^2.0.1", 1402 | "ecstatic": "^3.3.2", 1403 | "http-proxy": "^1.18.0", 1404 | "minimist": "^1.2.5", 1405 | "opener": "^1.5.1", 1406 | "portfinder": "^1.0.25", 1407 | "secure-compare": "3.0.1", 1408 | "union": "~0.5.0" 1409 | } 1410 | }, 1411 | "invariant": { 1412 | "version": "2.2.4", 1413 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1414 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1415 | "dev": true, 1416 | "requires": { 1417 | "loose-envify": "^1.0.0" 1418 | } 1419 | }, 1420 | "is-binary-path": { 1421 | "version": "2.1.0", 1422 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1423 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1424 | "dev": true, 1425 | "requires": { 1426 | "binary-extensions": "^2.0.0" 1427 | } 1428 | }, 1429 | "is-expression": { 1430 | "version": "4.0.0", 1431 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", 1432 | "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", 1433 | "dev": true, 1434 | "requires": { 1435 | "acorn": "^7.1.1", 1436 | "object-assign": "^4.1.1" 1437 | } 1438 | }, 1439 | "is-extglob": { 1440 | "version": "2.1.1", 1441 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1442 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1443 | "dev": true 1444 | }, 1445 | "is-glob": { 1446 | "version": "4.0.1", 1447 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1448 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1449 | "dev": true, 1450 | "requires": { 1451 | "is-extglob": "^2.1.1" 1452 | } 1453 | }, 1454 | "is-number": { 1455 | "version": "7.0.0", 1456 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1457 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1458 | "dev": true 1459 | }, 1460 | "is-promise": { 1461 | "version": "2.2.2", 1462 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", 1463 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", 1464 | "dev": true 1465 | }, 1466 | "is-regex": { 1467 | "version": "1.1.0", 1468 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", 1469 | "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", 1470 | "dev": true, 1471 | "requires": { 1472 | "has-symbols": "^1.0.1" 1473 | } 1474 | }, 1475 | "js-stringify": { 1476 | "version": "1.0.2", 1477 | "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", 1478 | "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", 1479 | "dev": true 1480 | }, 1481 | "js-tokens": { 1482 | "version": "4.0.0", 1483 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1484 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1485 | "dev": true 1486 | }, 1487 | "jsesc": { 1488 | "version": "2.5.2", 1489 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1490 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1491 | "dev": true 1492 | }, 1493 | "json5": { 1494 | "version": "2.1.3", 1495 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", 1496 | "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", 1497 | "dev": true, 1498 | "requires": { 1499 | "minimist": "^1.2.5" 1500 | } 1501 | }, 1502 | "jstransformer": { 1503 | "version": "1.0.0", 1504 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", 1505 | "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", 1506 | "dev": true, 1507 | "requires": { 1508 | "is-promise": "^2.0.0", 1509 | "promise": "^7.0.1" 1510 | } 1511 | }, 1512 | "leven": { 1513 | "version": "3.1.0", 1514 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 1515 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 1516 | "dev": true 1517 | }, 1518 | "levenary": { 1519 | "version": "1.1.1", 1520 | "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", 1521 | "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", 1522 | "dev": true, 1523 | "requires": { 1524 | "leven": "^3.1.0" 1525 | } 1526 | }, 1527 | "lodash": { 1528 | "version": "4.17.19", 1529 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 1530 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 1531 | "dev": true 1532 | }, 1533 | "loose-envify": { 1534 | "version": "1.4.0", 1535 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1536 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1537 | "dev": true, 1538 | "requires": { 1539 | "js-tokens": "^3.0.0 || ^4.0.0" 1540 | } 1541 | }, 1542 | "mime": { 1543 | "version": "1.6.0", 1544 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1545 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1546 | "dev": true 1547 | }, 1548 | "minimist": { 1549 | "version": "1.2.5", 1550 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1551 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1552 | "dev": true 1553 | }, 1554 | "mkdirp": { 1555 | "version": "0.5.5", 1556 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1557 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1558 | "dev": true, 1559 | "requires": { 1560 | "minimist": "^1.2.5" 1561 | } 1562 | }, 1563 | "ms": { 1564 | "version": "2.1.2", 1565 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1566 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1567 | "dev": true 1568 | }, 1569 | "node-releases": { 1570 | "version": "1.1.60", 1571 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", 1572 | "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", 1573 | "dev": true 1574 | }, 1575 | "normalize-path": { 1576 | "version": "3.0.0", 1577 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1578 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1579 | "dev": true 1580 | }, 1581 | "object-assign": { 1582 | "version": "4.1.1", 1583 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1584 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1585 | "dev": true 1586 | }, 1587 | "object-keys": { 1588 | "version": "1.1.1", 1589 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1590 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1591 | "dev": true 1592 | }, 1593 | "object.assign": { 1594 | "version": "4.1.0", 1595 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1596 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1597 | "dev": true, 1598 | "requires": { 1599 | "define-properties": "^1.1.2", 1600 | "function-bind": "^1.1.1", 1601 | "has-symbols": "^1.0.0", 1602 | "object-keys": "^1.0.11" 1603 | } 1604 | }, 1605 | "opener": { 1606 | "version": "1.5.1", 1607 | "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", 1608 | "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", 1609 | "dev": true 1610 | }, 1611 | "path-parse": { 1612 | "version": "1.0.6", 1613 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1614 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1615 | "dev": true 1616 | }, 1617 | "picomatch": { 1618 | "version": "2.2.2", 1619 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1620 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1621 | "dev": true 1622 | }, 1623 | "portfinder": { 1624 | "version": "1.0.28", 1625 | "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", 1626 | "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", 1627 | "dev": true, 1628 | "requires": { 1629 | "async": "^2.6.2", 1630 | "debug": "^3.1.1", 1631 | "mkdirp": "^0.5.5" 1632 | } 1633 | }, 1634 | "promise": { 1635 | "version": "7.3.1", 1636 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 1637 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 1638 | "dev": true, 1639 | "requires": { 1640 | "asap": "~2.0.3" 1641 | } 1642 | }, 1643 | "pug": { 1644 | "version": "3.0.0", 1645 | "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.0.tgz", 1646 | "integrity": "sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw==", 1647 | "dev": true, 1648 | "requires": { 1649 | "pug-code-gen": "^3.0.0", 1650 | "pug-filters": "^4.0.0", 1651 | "pug-lexer": "^5.0.0", 1652 | "pug-linker": "^4.0.0", 1653 | "pug-load": "^3.0.0", 1654 | "pug-parser": "^6.0.0", 1655 | "pug-runtime": "^3.0.0", 1656 | "pug-strip-comments": "^2.0.0" 1657 | } 1658 | }, 1659 | "pug-attrs": { 1660 | "version": "3.0.0", 1661 | "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", 1662 | "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", 1663 | "dev": true, 1664 | "requires": { 1665 | "constantinople": "^4.0.1", 1666 | "js-stringify": "^1.0.2", 1667 | "pug-runtime": "^3.0.0" 1668 | } 1669 | }, 1670 | "pug-code-gen": { 1671 | "version": "3.0.1", 1672 | "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.1.tgz", 1673 | "integrity": "sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ==", 1674 | "dev": true, 1675 | "requires": { 1676 | "constantinople": "^4.0.1", 1677 | "doctypes": "^1.1.0", 1678 | "js-stringify": "^1.0.2", 1679 | "pug-attrs": "^3.0.0", 1680 | "pug-error": "^2.0.0", 1681 | "pug-runtime": "^3.0.0", 1682 | "void-elements": "^3.1.0", 1683 | "with": "^7.0.0" 1684 | } 1685 | }, 1686 | "pug-error": { 1687 | "version": "2.0.0", 1688 | "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", 1689 | "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", 1690 | "dev": true 1691 | }, 1692 | "pug-filters": { 1693 | "version": "4.0.0", 1694 | "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", 1695 | "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", 1696 | "dev": true, 1697 | "requires": { 1698 | "constantinople": "^4.0.1", 1699 | "jstransformer": "1.0.0", 1700 | "pug-error": "^2.0.0", 1701 | "pug-walk": "^2.0.0", 1702 | "resolve": "^1.15.1" 1703 | } 1704 | }, 1705 | "pug-lexer": { 1706 | "version": "5.0.0", 1707 | "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.0.tgz", 1708 | "integrity": "sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A==", 1709 | "dev": true, 1710 | "requires": { 1711 | "character-parser": "^2.2.0", 1712 | "is-expression": "^4.0.0", 1713 | "pug-error": "^2.0.0" 1714 | } 1715 | }, 1716 | "pug-linker": { 1717 | "version": "4.0.0", 1718 | "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", 1719 | "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", 1720 | "dev": true, 1721 | "requires": { 1722 | "pug-error": "^2.0.0", 1723 | "pug-walk": "^2.0.0" 1724 | } 1725 | }, 1726 | "pug-load": { 1727 | "version": "3.0.0", 1728 | "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", 1729 | "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", 1730 | "dev": true, 1731 | "requires": { 1732 | "object-assign": "^4.1.1", 1733 | "pug-walk": "^2.0.0" 1734 | } 1735 | }, 1736 | "pug-parser": { 1737 | "version": "6.0.0", 1738 | "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", 1739 | "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", 1740 | "dev": true, 1741 | "requires": { 1742 | "pug-error": "^2.0.0", 1743 | "token-stream": "1.0.0" 1744 | } 1745 | }, 1746 | "pug-runtime": { 1747 | "version": "3.0.0", 1748 | "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.0.tgz", 1749 | "integrity": "sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA==", 1750 | "dev": true 1751 | }, 1752 | "pug-strip-comments": { 1753 | "version": "2.0.0", 1754 | "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", 1755 | "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", 1756 | "dev": true, 1757 | "requires": { 1758 | "pug-error": "^2.0.0" 1759 | } 1760 | }, 1761 | "pug-walk": { 1762 | "version": "2.0.0", 1763 | "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", 1764 | "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", 1765 | "dev": true 1766 | }, 1767 | "qs": { 1768 | "version": "6.9.4", 1769 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", 1770 | "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", 1771 | "dev": true 1772 | }, 1773 | "readdirp": { 1774 | "version": "3.4.0", 1775 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", 1776 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", 1777 | "dev": true, 1778 | "requires": { 1779 | "picomatch": "^2.2.1" 1780 | } 1781 | }, 1782 | "regenerate": { 1783 | "version": "1.4.1", 1784 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", 1785 | "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", 1786 | "dev": true 1787 | }, 1788 | "regenerate-unicode-properties": { 1789 | "version": "8.2.0", 1790 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", 1791 | "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", 1792 | "dev": true, 1793 | "requires": { 1794 | "regenerate": "^1.4.0" 1795 | } 1796 | }, 1797 | "regenerator-runtime": { 1798 | "version": "0.13.7", 1799 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1800 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", 1801 | "dev": true 1802 | }, 1803 | "regenerator-transform": { 1804 | "version": "0.14.5", 1805 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", 1806 | "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", 1807 | "dev": true, 1808 | "requires": { 1809 | "@babel/runtime": "^7.8.4" 1810 | } 1811 | }, 1812 | "regexpu-core": { 1813 | "version": "4.7.0", 1814 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", 1815 | "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", 1816 | "dev": true, 1817 | "requires": { 1818 | "regenerate": "^1.4.0", 1819 | "regenerate-unicode-properties": "^8.2.0", 1820 | "regjsgen": "^0.5.1", 1821 | "regjsparser": "^0.6.4", 1822 | "unicode-match-property-ecmascript": "^1.0.4", 1823 | "unicode-match-property-value-ecmascript": "^1.2.0" 1824 | } 1825 | }, 1826 | "regjsgen": { 1827 | "version": "0.5.2", 1828 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", 1829 | "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", 1830 | "dev": true 1831 | }, 1832 | "regjsparser": { 1833 | "version": "0.6.4", 1834 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", 1835 | "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", 1836 | "dev": true, 1837 | "requires": { 1838 | "jsesc": "~0.5.0" 1839 | }, 1840 | "dependencies": { 1841 | "jsesc": { 1842 | "version": "0.5.0", 1843 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1844 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 1845 | "dev": true 1846 | } 1847 | } 1848 | }, 1849 | "requires-port": { 1850 | "version": "1.0.0", 1851 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1852 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 1853 | "dev": true 1854 | }, 1855 | "resolve": { 1856 | "version": "1.17.0", 1857 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1858 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1859 | "dev": true, 1860 | "requires": { 1861 | "path-parse": "^1.0.6" 1862 | } 1863 | }, 1864 | "safe-buffer": { 1865 | "version": "5.1.2", 1866 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1867 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1868 | "dev": true 1869 | }, 1870 | "sass": { 1871 | "version": "1.26.10", 1872 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", 1873 | "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", 1874 | "dev": true, 1875 | "requires": { 1876 | "chokidar": ">=2.0.0 <4.0.0" 1877 | } 1878 | }, 1879 | "secure-compare": { 1880 | "version": "3.0.1", 1881 | "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", 1882 | "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=", 1883 | "dev": true 1884 | }, 1885 | "semver": { 1886 | "version": "5.7.1", 1887 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1888 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1889 | "dev": true 1890 | }, 1891 | "source-map": { 1892 | "version": "0.5.7", 1893 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1894 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1895 | "dev": true 1896 | }, 1897 | "supports-color": { 1898 | "version": "5.5.0", 1899 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1900 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1901 | "dev": true, 1902 | "requires": { 1903 | "has-flag": "^3.0.0" 1904 | } 1905 | }, 1906 | "to-fast-properties": { 1907 | "version": "2.0.0", 1908 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1909 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1910 | "dev": true 1911 | }, 1912 | "to-regex-range": { 1913 | "version": "5.0.1", 1914 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1915 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1916 | "dev": true, 1917 | "requires": { 1918 | "is-number": "^7.0.0" 1919 | } 1920 | }, 1921 | "token-stream": { 1922 | "version": "1.0.0", 1923 | "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", 1924 | "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", 1925 | "dev": true 1926 | }, 1927 | "unicode-canonical-property-names-ecmascript": { 1928 | "version": "1.0.4", 1929 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", 1930 | "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", 1931 | "dev": true 1932 | }, 1933 | "unicode-match-property-ecmascript": { 1934 | "version": "1.0.4", 1935 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", 1936 | "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", 1937 | "dev": true, 1938 | "requires": { 1939 | "unicode-canonical-property-names-ecmascript": "^1.0.4", 1940 | "unicode-property-aliases-ecmascript": "^1.0.4" 1941 | } 1942 | }, 1943 | "unicode-match-property-value-ecmascript": { 1944 | "version": "1.2.0", 1945 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", 1946 | "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", 1947 | "dev": true 1948 | }, 1949 | "unicode-property-aliases-ecmascript": { 1950 | "version": "1.1.0", 1951 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", 1952 | "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", 1953 | "dev": true 1954 | }, 1955 | "union": { 1956 | "version": "0.5.0", 1957 | "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", 1958 | "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", 1959 | "dev": true, 1960 | "requires": { 1961 | "qs": "^6.4.0" 1962 | } 1963 | }, 1964 | "url-join": { 1965 | "version": "2.0.5", 1966 | "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", 1967 | "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", 1968 | "dev": true 1969 | }, 1970 | "void-elements": { 1971 | "version": "3.1.0", 1972 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", 1973 | "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=", 1974 | "dev": true 1975 | }, 1976 | "with": { 1977 | "version": "7.0.2", 1978 | "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", 1979 | "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", 1980 | "dev": true, 1981 | "requires": { 1982 | "@babel/parser": "^7.9.6", 1983 | "@babel/types": "^7.9.6", 1984 | "assert-never": "^1.2.1", 1985 | "babel-walk": "3.0.0-canary-5" 1986 | } 1987 | } 1988 | } 1989 | } 1990 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "invidious-redirect", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "build.js", 6 | "scripts": { 7 | "build": "node src/build.js", 8 | "watch": "fish -c 'while true; npm run build; inotifywait (find src -type f) -e close_write -q; end'" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "AGPL-3.0-only", 13 | "dependencies": {}, 14 | "devDependencies": { 15 | "@babel/core": "^7.11.1", 16 | "@babel/preset-env": "^7.11.0", 17 | "http-server": "^0.12.3", 18 | "pug": "^3.0.0", 19 | "sass": "^1.26.10" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/assets/img/invidious-logo-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/img/invidious-logo-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/build.js: -------------------------------------------------------------------------------- 1 | process.chdir(__dirname) 2 | 3 | const pug = require("pug") 4 | const sass = require("sass") 5 | const fs = require("fs").promises 6 | const crypto = require("crypto") 7 | const pj = require("path").join 8 | const babel = require("@babel/core") 9 | 10 | const buildDir = "../build" 11 | 12 | const static = new Map() 13 | const links = new Map() 14 | const scripts = [] 15 | const pugLocals = {static, scripts, links} 16 | 17 | const spec = [ 18 | { 19 | type: "file", 20 | source: "/assets/img/invidious-logo-dark.svg", 21 | target: "/static/img/invidious-logo-dark.svg" 22 | },{ 23 | type: "file", 24 | source: "/assets/img/invidious-logo-light.svg", 25 | target: "/static/img/invidious-logo-light.svg" 26 | },{ 27 | type: "sass", 28 | source: "/main.sass", 29 | target: "/static/css/main.css" 30 | },{ 31 | type: "babel", 32 | source: "/main.js", 33 | target: "/static/js/main.js" 34 | },{ 35 | type: "pug", 36 | source: "/index.pug", 37 | target: "/index.html" 38 | },{ 39 | type: "pug", 40 | source: "/js-licenses.pug", 41 | target: "/js-licenses.html" 42 | } 43 | ] 44 | 45 | function hash(buffer) { 46 | return crypto.createHash("sha256").update(buffer).digest("hex").slice(0, 10) 47 | } 48 | 49 | async function addFile(sourcePath, targetPath) { 50 | const contents = await fs.readFile(pj(".", sourcePath), {encoding: null}) 51 | static.set(sourcePath, `${targetPath}?static=${hash(contents)}`) 52 | fs.writeFile(pj(buildDir, targetPath), contents) 53 | } 54 | 55 | async function addSass(sourcePath, targetPath) { 56 | const renderedCSS = sass.renderSync({ 57 | file: pj(".", sourcePath), 58 | outputStyle: "compressed", 59 | functions: { 60 | "static($name)": function(name) { 61 | if (!(name instanceof sass.types.String)) { 62 | throw "$name: expected a string" 63 | } 64 | return new sass.types.String(static.get(name.getValue())) 65 | } 66 | } 67 | }).css 68 | static.set(sourcePath, `${targetPath}?static=${hash(renderedCSS)}`) 69 | await fs.writeFile(pj(buildDir, targetPath), renderedCSS) 70 | } 71 | 72 | async function addPug(sourcePath, targetPath) { 73 | const renderedHTML = pug.compileFile(pj(".", sourcePath))(pugLocals) 74 | await fs.writeFile(pj(buildDir, targetPath), renderedHTML) 75 | } 76 | 77 | async function addBabel(sourcePath, targetPath) { 78 | const originalCode = await fs.readFile(pj(".", sourcePath), "utf8") 79 | 80 | const compiled = babel.transformSync(originalCode, { 81 | sourceMaps: true, 82 | sourceType: "script", 83 | presets: [ 84 | [ 85 | "@babel/env", { 86 | targets: { 87 | "ie": 11 88 | } 89 | } 90 | ] 91 | ], 92 | generatorOpts: { 93 | comments: false, 94 | minified: true, 95 | sourceMaps: true, 96 | } 97 | }) 98 | 99 | const minFilename = targetPath.replace(/\.js$/, ".min.js") 100 | const minFilenameWithQuery = `${minFilename}?static=${hash(compiled.code)}` 101 | const mapFilename = `${minFilename}.map` 102 | 103 | compiled.code += `\n//# sourceMappingURL=${mapFilename}` 104 | 105 | static.set(sourcePath, minFilenameWithQuery) 106 | scripts.push({ 107 | original: targetPath, 108 | minified: minFilename, 109 | license: "GNU-AGPL-3.0-or-later", 110 | licenseHref: "http://www.gnu.org/licenses/agpl-3.0.html" 111 | }) 112 | 113 | await Promise.all([ 114 | fs.writeFile(pj(buildDir, targetPath), originalCode), 115 | fs.writeFile(pj(buildDir, minFilename), compiled.code), 116 | fs.writeFile(pj(buildDir, mapFilename), JSON.stringify(compiled.map)) 117 | ]) 118 | } 119 | 120 | ;(async () => { 121 | // Stage 1: Register 122 | for (const item of spec) { 123 | if (item.type === "pug") { 124 | links.set(item.source, item.target) 125 | } 126 | } 127 | 128 | // Stage 2: Build 129 | for (const item of spec) { 130 | if (item.type === "file") { 131 | await addFile(item.source, item.target) 132 | } else if (item.type === "sass") { 133 | await addSass(item.source, item.target) 134 | } else if (item.type === "babel") { 135 | await addBabel(item.source, item.target) 136 | } else if (item.type === "pug") { 137 | await addPug(item.source, item.target) 138 | } else { 139 | throw new Error("Unknown item type: "+item.type) 140 | } 141 | } 142 | 143 | console.log("Build complete.") 144 | })() 145 | -------------------------------------------------------------------------------- /src/footer.pug: -------------------------------------------------------------------------------- 1 | footer 2 | ul.footer-link-list 3 | li: a(href="/") Home 4 | li: a(href="https://github.com/iv-org/invidious-redirect") Source code 5 | li: a(href="https://github.com/iv-org/invidious") Invidious project 6 | li: a(href=links.get("/js-licenses.pug") data-jslicense="1") JavaScript license 7 | -------------------------------------------------------------------------------- /src/header.pug: -------------------------------------------------------------------------------- 1 | header.banner 2 | .logo 3 | h1 Invidious 4 | -------------------------------------------------------------------------------- /src/index.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang="en") 3 | head 4 | title Select instance - Invidious 5 | meta(charset="utf-8") 6 | meta(name="viewport" content="width=device-width, initial-scale=1") 7 | link(rel="stylesheet" type="text/css" href=static.get("/main.sass")) 8 | script(src=static.get("/main.js") text="text/javascript" defer) 9 | body 10 | noscript 11 | style. 12 | .requires-scripts { 13 | display: none; 14 | } 15 | 16 | include header.pug 17 | 18 | noscript 19 | .script-warning 20 | p. 21 | You are seeing the fallback version of this page.#[br] 22 | Some features are missing. 23 | p. 24 | JavaScript is required to use the regular page. 25 | 26 | .story 27 | .requires-scripts 28 | p. 29 | To see this content, select an instance, 30 | or #[a#watch-on-youtube see directly on YouTube.] 31 | noscript 32 | p. 33 | To see this content, please select an instance, 34 | or #[a(href="https://www.youtube.com") go to YouTube] and look for it there. 35 | 36 | .instances-table.requires-scripts 37 | table 38 | thead 39 | tr 40 | th(scope="col") Region 41 | th(scope="col") Domain 42 | th(scope="col") Health 43 | th(scope="col") Action 44 | tbody#instances-tbody 45 | tr.loading 46 | td(colspan="4" data-loading-message="Loading instances...").loading-td Trying to run scripts... 47 | 48 | noscript 49 | .instances-list 50 | h2 Available instances 51 | ul.list 52 | - 53 | const instances = [ 54 | {url: "yewtu.be", flag: "🇳🇱"}, 55 | {url: "vid.puffyan.us", flag: "🇺🇸"}, 56 | {url: "invidious.flokinet.to", flag: "🇷🇴"}, 57 | {url: "invidious.projectsegfau.lt", flag: "🇫🇷"}, 58 | {url: "inv.bp.projectsegfau.lt", flag: "🇱🇺"}, 59 | {url: "inv.in.projectsegfau.lt", flag: "🇮🇳"}, 60 | {url: "invidious.tiekoetter.com", flag: "🇩🇪"}, 61 | {url: "invidious.slipfox.xyz", flag: "🇺🇸"}, 62 | {url: "invidious.privacydev.net", flag: "🇫🇷"}, 63 | {url: "vid.priv.au", flag: "🇸🇬"}, 64 | {url: "iv.ggtyler.dev", flag: "🇨🇦"}, 65 | {url: "invidious.0011.lt", flag: "🇱🇹"}, 66 | {url: "inv.zzls.xyz", flag: "🇨🇱"}, 67 | {url: "invidious.protokolla.fi", flag: "🇫🇮"}, 68 | ] 69 | for instance in instances 70 | li 71 | = `${instance.flag} ` 72 | a(href=`https://${instance.url}`)= instance.url 73 | 74 | include footer.pug 75 | -------------------------------------------------------------------------------- /src/js-licenses.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang="en") 3 | head 4 | title JavaScript licenses - Invidious 5 | meta(charset="utf-8") 6 | meta(name="viewport" content="width=device-width, initial-scale=1") 7 | link(rel="stylesheet" type="text/css" href=static.get("/main.sass")) 8 | body 9 | include header.pug 10 | 11 | .js-license-table 12 | table#jslicense-labels1 13 | thead 14 | tr 15 | th(scope="col") File 16 | th(scope="col") License 17 | th(scope="col") Source 18 | tbody 19 | each script in scripts 20 | tr 21 | td: a(href=script.minified)= script.minified 22 | td: a(href=script.licenseHref)= script.license 23 | td: a(href=script.original)= script.original 24 | 25 | include footer.pug 26 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | ;(() => { 4 | const q = s => document.querySelector(s) 5 | const qa = s => document.querySelectorAll(s) 6 | 7 | function createElement(tag, properties = {}, children = []) { 8 | const e = document.createElement(tag) 9 | for (const key of Object.keys(properties)) { 10 | e[key] = properties[key] 11 | } 12 | for (const child of children) { 13 | e.appendChild(child) 14 | } 15 | return e 16 | } 17 | 18 | function shuffle(array) { 19 | for (let i = 0; i < array.length; i++) { 20 | let j = Math.floor(Math.random() * (array.length-i)) + i 21 | ;[array[i], array[j]] = [array[j], array[i]] 22 | } 23 | return array 24 | } 25 | 26 | function request(url, callback) { 27 | const xhr = new XMLHttpRequest() 28 | xhr.addEventListener("readystatechange", () => { 29 | if (xhr.readyState === 4) { 30 | if (xhr.status === 200) { 31 | callback(null, JSON.parse(xhr.response)) 32 | } 33 | } 34 | }) 35 | xhr.open("GET", url) 36 | xhr.send() 37 | } 38 | 39 | const destinationPath = window.location.href.slice(window.location.origin.length) 40 | 41 | q("#watch-on-youtube").href = "https://www.youtube.com" + destinationPath 42 | 43 | for (const e of qa("[data-loading-message]")) { 44 | e.textContent = e.getAttribute("data-loading-message") 45 | } 46 | 47 | request("https://api.invidious.io/instances.json?sort_by=type,health", 48 | /** @param {[string, {monitor: any, flag: string, region: string, stats: any, type: string, uri: string}][]} root */ (err, root) => { 49 | shuffle(root) 50 | root.map(entry => { 51 | const healthKnown = !!entry[1].monitor 52 | return { 53 | name: entry[0], 54 | details: entry[1], 55 | health: +(healthKnown ? entry[1].monitor.uptime : 95), 56 | healthKnown 57 | } 58 | }).filter(entry => { 59 | return entry.details.type === "https" && entry.health > 0 60 | }).sort((a, b) => { 61 | return b.health - a.health 62 | }).forEach(entry => { 63 | let target = entry.details.uri.replace(/\/*$/, "") + destinationPath 64 | const healthUnknown = entry.healthKnown ? "" : "health-unknown " 65 | const health = entry.healthKnown ? entry.health.toFixed(0) : "(unknown)" 66 | q("#instances-tbody").appendChild( 67 | createElement("tr", {}, [ 68 | createElement("td", {textContent: `${entry.details.flag} ${entry.details.region}`}), 69 | createElement("td", {textContent: entry.name}), 70 | createElement("td", {className: "column-center "+healthUnknown, textContent: health}), 71 | createElement("td", {className: "column-center"}, [ 72 | createElement("a", {href: target, textContent: "Go →"}) 73 | ]) 74 | ]) 75 | ) 76 | }) 77 | 78 | for (const e of qa(".loading")) { 79 | e.remove() 80 | } 81 | }) 82 | })() 83 | -------------------------------------------------------------------------------- /src/main.sass: -------------------------------------------------------------------------------- 1 | @mixin prefers-dark 2 | @media (prefers-color-scheme: dark) 3 | @content 4 | 5 | @mixin desktop 6 | @media screen and (min-width: 520px) 7 | @content 8 | 9 | :root 10 | --bg-primary: #fcf5f4 11 | --bg-secondary: #e9e1df 12 | --bg-tertiary: #cec8c6 13 | --fg-header: #000 14 | --fg-primary: #181818 15 | --fg-dim: #646464 16 | --fg-link: #2664b5 17 | --edge-mark: #aaa 18 | --edge-table: #333 19 | 20 | @include prefers-dark 21 | --bg-primary: #232323 22 | --bg-secondary: #191919 23 | --bg-tertiary: #383838 24 | --fg-header: #fff 25 | --fg-primary: #d9d9d9 26 | --fg-dim: #828282 27 | --fg-link: #529ef5 28 | --edge-mark: #555 29 | --edge-table: #aaa 30 | 31 | body 32 | background-color: var(--bg-primary) 33 | color: var(--fg-primary) 34 | font-size: 20px 35 | margin: 0 36 | padding: 8px 37 | font-family: sans-serif 38 | 39 | a, a:visited 40 | color: var(--fg-link) 41 | 42 | noscript 43 | display: block 44 | 45 | mark 46 | background-color: var(--bg-tertiary) 47 | color: var(--fg-primary) 48 | padding: 3px 5px 49 | border-radius: 4px 50 | border: 1px solid var(--edge-mark) 51 | 52 | table, td, th 53 | border: 1px solid var(--edge-table) 54 | border-collapse: collapse 55 | 56 | td, th 57 | padding: 4px 8px 58 | 59 | thead, tr:nth-child(even) 60 | background-color: var(--bg-secondary) 61 | 62 | footer 63 | font-size: 16px 64 | text-align: center 65 | max-width: 500px 66 | margin: 40px auto 67 | 68 | .banner 69 | display: grid 70 | grid-gap: 24px 71 | align-items: center 72 | justify-items: center 73 | justify-content: center 74 | padding: 20px 75 | 76 | @include desktop 77 | grid-template-columns: 80px auto 78 | 79 | .logo 80 | width: 80px 81 | height: 80px 82 | background-size: contain 83 | background-image: url(static("/assets/img/invidious-logo-light.svg")) 84 | 85 | @include prefers-dark 86 | background-image: url(static("/assets/img/invidious-logo-dark.svg")) 87 | 88 | h1 89 | color: var(--fg-header) 90 | font-size: 56px 91 | font-weight: bold 92 | text-transform: uppercase 93 | margin: 0 94 | padding: 0 95 | 96 | .story 97 | margin: 40px 0px 98 | text-align: center 99 | 100 | @include desktop 101 | white-space: pre-line 102 | 103 | .instances-table, .js-license-table 104 | display: flex 105 | justify-content: center 106 | 107 | table 108 | width: 100% 109 | max-width: 700px 110 | 111 | .instances-list 112 | text-align: center 113 | 114 | .list 115 | margin: 0 auto 116 | padding-left: 1em 117 | text-align: left 118 | max-width: max-content 119 | 120 | .loading-td 121 | text-align: center 122 | padding: 20px 123 | background-color: var(--bg-secondary) 124 | 125 | .column-center 126 | text-align: center 127 | 128 | .health-unknown 129 | color: var(--fg-dim) 130 | 131 | .script-warning 132 | margin: 0 auto 133 | max-width: max-content 134 | background: #700 135 | color: #fff 136 | padding: 4px 20px 137 | border-radius: 8px 138 | border: 1px solid 139 | 140 | .footer-link-list 141 | margin: 0 142 | padding: 0 143 | justify-content: center 144 | display: flex 145 | list-style-type: none 146 | white-space: pre-wrap 147 | flex-wrap: wrap 148 | 149 | li:not(:first-child)::before 150 | content: " • " 151 | display: inline 152 | --------------------------------------------------------------------------------