gubes mirror. how does this work
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

g

+4707 -1267
+4 -3
README.md
··· 40 40 documentation at the moment, so if you get stuck and/or confused please do ping 41 41 me! 42 42 43 - > [!NOTE] 44 - > This is a purely ideological project. Any changes that appear technically motivated will be rejected. 43 + > [!NOTE]\ 44 + > This is a purely ideological project. Any changes that appear technically 45 + > motivated will be rejected. 45 46 46 47 [codeberg]: https://codeberg.org/smethwick/tubes 47 48 [issues]: https://codeberg.org/smethwick/tubes/issues 48 49 49 50 ## licence 50 51 51 - MPL 2.0, except tubes_core (inside lib/), which is ISC 52 + MPL 2.0, except tubes_core (inside core/), which is ISC
+1 -1
core/adapter.ts
··· 1 - import { Signal } from "@preact/signals"; 1 + import { Signal } from "@preact/signals-core"; 2 2 import { Connection, ConnectionConfig } from "./connection"; 3 3 import { IrcProtocol } from "./support"; 4 4
+35 -13
core/channel.ts
··· 1 1 import type { Connection } from "./connection"; 2 2 import { IrcMessage } from "./parser"; 3 - import { IrcChannelState } from "./support"; 3 + import { IrcChannelState, Numeric } from "./support"; 4 4 import { Mutex } from 'async-mutex'; 5 - import { signal, Signal, batch } from "@preact/signals"; 5 + import { signal, Signal, batch } from "@preact/signals-core"; 6 6 import { FetchHistoryParams } from "./history"; 7 + import { ArrayMatcher, Matcher, Wildcard } from "./queue"; 7 8 8 9 const member_prefixes = [ 9 10 "~", "&", "@", "%" ··· 49 50 50 51 // set the range for the next iteration 51 52 next_range = { after: oldest }; 52 - 53 + 53 54 page.reverse(); 54 55 } else { 55 56 // as above, but inverted ··· 130 131 this.$state.value = initial_state; 131 132 132 133 this.join_promise = new Promise((resolve, reject) => { 133 - this.join_resolve = resolve; 134 - this.join_reject = reject; 134 + this.#join_resolve = resolve; 135 + this.#join_reject = reject; 135 136 136 137 setTimeout(() => { 137 138 if (this.$state.value == IrcChannelState.Pending) { 138 139 this.$state.value = IrcChannelState.Failed; 139 140 this.$error.value = "Timed out"; 140 - this.join_reject("Timed out"); 141 + this.#join_reject("Timed out"); 141 142 } 142 143 }, 30000); 143 144 }); ··· 149 150 150 151 $members: Signal<string[]> = signal([]); 151 152 $member_names: Signal<string[]> = signal([]); 152 - member_mutex = new Mutex(); 153 + #member_mutex = new Mutex(); 153 154 154 155 join_promise: Promise<IrcChannel>; 155 156 156 - private join_resolve!: (value: IrcChannel) => void; 157 - private join_reject!: (reason?: any) => void; 157 + #join_resolve!: (value: IrcChannel) => void; 158 + #join_reject!: (reason?: any) => void; 158 159 159 160 finish_join() { 160 161 this.$state.value = IrcChannelState.Joined; 161 - this.join_resolve(this); 162 + this.#join_resolve(this); 162 163 } 163 164 164 165 handle_join(message: IrcMessage) { 165 166 const nick = message.source!.nick; 166 - this.member_mutex.runExclusive(() => { 167 + this.#member_mutex.runExclusive(() => { 167 168 this.$members.value = [...this.$members.value, nick]; 168 169 }) 169 170 } 170 171 171 172 handle_part(message: IrcMessage) { 172 173 const nick = message.source!.nick; 173 - this.member_mutex.runExclusive(() => { 174 + this.#member_mutex.runExclusive(() => { 174 175 this.$members.value = this.$members.value.filter(o => o != nick); 175 176 }); 176 177 } ··· 197 198 return o; 198 199 }); 199 200 200 - this.member_mutex.runExclusive(() => { 201 + this.#member_mutex.runExclusive(() => { 201 202 if (this.#has_all_names) { 202 203 this.$members.value = []; 203 204 } ··· 229 230 this.$members.value = []; 230 231 this.$state.value = IrcChannelState.Parted; 231 232 }) 233 + } 234 + 235 + /** 236 + * Set the channel's topic. 237 + * @param text The new topic for the channel 238 + * @returns A promise that resolves when the server acknowledges the change, 239 + * or rejects if the server isn't happy with it. 240 + */ 241 + set_topic(text: string) { 242 + this.conn.send(`TOPIC ${this.name} :${text}`); 243 + return this.conn.expect( 244 + `changing topic for ${this.name}`, 245 + new Matcher("TOPIC", this.name), 246 + // rejection cases 247 + new ArrayMatcher( 248 + new Matcher(Numeric.ERR_CHANOPRIVSNEEDED, Wildcard.Any, this.name), 249 + new Matcher(Numeric.ERR_NOTONCHANNEL, Wildcard.Any, this.name), 250 + new Matcher(Numeric.ERR_NOSUCHCHANNEL, Wildcard.Any, this.name), 251 + new Matcher(Numeric.ERR_NEEDMOREPARAMS, Wildcard.Any, this.name), 252 + ) 253 + ) 232 254 } 233 255 } 234 256
+3 -2
core/connection.ts
··· 1 - import { Signal, signal } from "@preact/signals"; 1 + import { Signal, signal } from "@preact/signals-core"; 2 2 import { nanoid } from "nanoid"; 3 3 import { ChatBuffer, IrcChannel } from "./channel"; 4 4 import { MessageHandler, default_handler } from "./handler"; ··· 104 104 SaslFailed, 105 105 SaslTooLong, 106 106 SaslAborted, 107 + Banned, 107 108 } 108 109 109 110 const ping_interval = 30000; ··· 335 336 336 337 if (!supported_chan_prefixes.includes(channel.charAt(0))) { 337 338 throw new Error( 338 - `Channels on this network must start with one of these: ` + 339 + `Channels on this network must start with one of these symbols: ` + 339 340 supported_chan_prefixes.join(", ") 340 341 ); 341 342 }
+8 -1
core/handler.ts
··· 1 - import { batch } from "@preact/signals"; 1 + import { batch } from "@preact/signals-core"; 2 2 import { IrcChannel } from "./channel"; 3 3 import { Connection, ConnectionErrorCode, ConnectionState } from "./connection"; 4 4 import { parse_isupport } from "./isupport"; ··· 15 15 connection.$error.value = [ConnectionErrorCode.NickTaken, message]; 16 16 } 17 17 18 + break; 19 + } 20 + 21 + case Numeric.ERR_YOUREBANNEDCREEP: { 22 + connection.disconnect(ConnectionState.Failed); 23 + connection.$error.value = [ConnectionErrorCode.Banned, message]; 24 + 18 25 break; 19 26 } 20 27
+140 -161
core/package-lock.json
··· 9 9 "version": "0.0.9", 10 10 "license": "ISC", 11 11 "dependencies": { 12 - "@preact/signals": "^1.3.0", 12 + "@preact/signals-core": "^1.8.0", 13 13 "async-mutex": "^0.5.0", 14 14 "isomorphic-ws": "^5.0.0", 15 15 "nanoid": "^5.0.7", ··· 452 452 "@jridgewell/sourcemap-codec": "^1.4.14" 453 453 } 454 454 }, 455 - "node_modules/@preact/signals": { 456 - "version": "1.3.0", 457 - "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-1.3.0.tgz", 458 - "integrity": "sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==", 459 - "dependencies": { 460 - "@preact/signals-core": "^1.7.0" 461 - }, 462 - "funding": { 463 - "type": "opencollective", 464 - "url": "https://opencollective.com/preact" 465 - }, 466 - "peerDependencies": { 467 - "preact": "10.x" 468 - } 469 - }, 470 455 "node_modules/@preact/signals-core": { 471 - "version": "1.7.0", 472 - "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.7.0.tgz", 473 - "integrity": "sha512-bEZLgmJGSBVP5PUPDowhPW3bVdMmp9Tr5OEl+SQK+8Tv9T7UsIfyN905cfkmmeqw8z4xp8T6zrl4M1uj9+HAfg==", 456 + "version": "1.8.0", 457 + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.8.0.tgz", 458 + "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==", 474 459 "funding": { 475 460 "type": "opencollective", 476 461 "url": "https://opencollective.com/preact" 477 462 } 478 463 }, 479 464 "node_modules/@rollup/rollup-android-arm-eabi": { 480 - "version": "4.19.1", 481 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz", 482 - "integrity": "sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==", 465 + "version": "4.21.2", 466 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", 467 + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", 483 468 "cpu": [ 484 469 "arm" 485 470 ], ··· 490 475 ] 491 476 }, 492 477 "node_modules/@rollup/rollup-android-arm64": { 493 - "version": "4.19.1", 494 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz", 495 - "integrity": "sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==", 478 + "version": "4.21.2", 479 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", 480 + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", 496 481 "cpu": [ 497 482 "arm64" 498 483 ], ··· 503 488 ] 504 489 }, 505 490 "node_modules/@rollup/rollup-darwin-arm64": { 506 - "version": "4.19.1", 507 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz", 508 - "integrity": "sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==", 491 + "version": "4.21.2", 492 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", 493 + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", 509 494 "cpu": [ 510 495 "arm64" 511 496 ], ··· 516 501 ] 517 502 }, 518 503 "node_modules/@rollup/rollup-darwin-x64": { 519 - "version": "4.19.1", 520 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz", 521 - "integrity": "sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==", 504 + "version": "4.21.2", 505 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", 506 + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", 522 507 "cpu": [ 523 508 "x64" 524 509 ], ··· 529 514 ] 530 515 }, 531 516 "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 532 - "version": "4.19.1", 533 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz", 534 - "integrity": "sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==", 517 + "version": "4.21.2", 518 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", 519 + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", 535 520 "cpu": [ 536 521 "arm" 537 522 ], ··· 542 527 ] 543 528 }, 544 529 "node_modules/@rollup/rollup-linux-arm-musleabihf": { 545 - "version": "4.19.1", 546 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz", 547 - "integrity": "sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==", 530 + "version": "4.21.2", 531 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", 532 + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", 548 533 "cpu": [ 549 534 "arm" 550 535 ], ··· 555 540 ] 556 541 }, 557 542 "node_modules/@rollup/rollup-linux-arm64-gnu": { 558 - "version": "4.19.1", 559 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz", 560 - "integrity": "sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==", 543 + "version": "4.21.2", 544 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", 545 + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", 561 546 "cpu": [ 562 547 "arm64" 563 548 ], ··· 568 553 ] 569 554 }, 570 555 "node_modules/@rollup/rollup-linux-arm64-musl": { 571 - "version": "4.19.1", 572 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz", 573 - "integrity": "sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==", 556 + "version": "4.21.2", 557 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", 558 + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", 574 559 "cpu": [ 575 560 "arm64" 576 561 ], ··· 581 566 ] 582 567 }, 583 568 "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 584 - "version": "4.19.1", 585 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz", 586 - "integrity": "sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==", 569 + "version": "4.21.2", 570 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", 571 + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", 587 572 "cpu": [ 588 573 "ppc64" 589 574 ], ··· 594 579 ] 595 580 }, 596 581 "node_modules/@rollup/rollup-linux-riscv64-gnu": { 597 - "version": "4.19.1", 598 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz", 599 - "integrity": "sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==", 582 + "version": "4.21.2", 583 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", 584 + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", 600 585 "cpu": [ 601 586 "riscv64" 602 587 ], ··· 607 592 ] 608 593 }, 609 594 "node_modules/@rollup/rollup-linux-s390x-gnu": { 610 - "version": "4.19.1", 611 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz", 612 - "integrity": "sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==", 595 + "version": "4.21.2", 596 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", 597 + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", 613 598 "cpu": [ 614 599 "s390x" 615 600 ], ··· 620 605 ] 621 606 }, 622 607 "node_modules/@rollup/rollup-linux-x64-gnu": { 623 - "version": "4.19.1", 624 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz", 625 - "integrity": "sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==", 608 + "version": "4.21.2", 609 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", 610 + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", 626 611 "cpu": [ 627 612 "x64" 628 613 ], ··· 633 618 ] 634 619 }, 635 620 "node_modules/@rollup/rollup-linux-x64-musl": { 636 - "version": "4.19.1", 637 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz", 638 - "integrity": "sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==", 621 + "version": "4.21.2", 622 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", 623 + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", 639 624 "cpu": [ 640 625 "x64" 641 626 ], ··· 646 631 ] 647 632 }, 648 633 "node_modules/@rollup/rollup-win32-arm64-msvc": { 649 - "version": "4.19.1", 650 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz", 651 - "integrity": "sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==", 634 + "version": "4.21.2", 635 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", 636 + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", 652 637 "cpu": [ 653 638 "arm64" 654 639 ], ··· 659 644 ] 660 645 }, 661 646 "node_modules/@rollup/rollup-win32-ia32-msvc": { 662 - "version": "4.19.1", 663 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz", 664 - "integrity": "sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==", 647 + "version": "4.21.2", 648 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", 649 + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", 665 650 "cpu": [ 666 651 "ia32" 667 652 ], ··· 672 657 ] 673 658 }, 674 659 "node_modules/@rollup/rollup-win32-x64-msvc": { 675 - "version": "4.19.1", 676 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz", 677 - "integrity": "sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==", 660 + "version": "4.21.2", 661 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", 662 + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", 678 663 "cpu": [ 679 664 "x64" 680 665 ], ··· 691 676 "dev": true 692 677 }, 693 678 "node_modules/@types/node": { 694 - "version": "22.0.0", 695 - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.0.0.tgz", 696 - "integrity": "sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==", 679 + "version": "22.5.4", 680 + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", 681 + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", 697 682 "dev": true, 698 683 "dependencies": { 699 - "undici-types": "~6.11.1" 684 + "undici-types": "~6.19.2" 700 685 } 701 686 }, 702 687 "node_modules/@types/ws": { ··· 709 694 } 710 695 }, 711 696 "node_modules/@vitest/expect": { 712 - "version": "2.0.4", 713 - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", 714 - "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", 697 + "version": "2.0.5", 698 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", 699 + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", 715 700 "dev": true, 716 701 "dependencies": { 717 - "@vitest/spy": "2.0.4", 718 - "@vitest/utils": "2.0.4", 702 + "@vitest/spy": "2.0.5", 703 + "@vitest/utils": "2.0.5", 719 704 "chai": "^5.1.1", 720 705 "tinyrainbow": "^1.2.0" 721 706 }, ··· 724 709 } 725 710 }, 726 711 "node_modules/@vitest/pretty-format": { 727 - "version": "2.0.4", 728 - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", 729 - "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", 712 + "version": "2.0.5", 713 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", 714 + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", 730 715 "dev": true, 731 716 "dependencies": { 732 717 "tinyrainbow": "^1.2.0" ··· 736 721 } 737 722 }, 738 723 "node_modules/@vitest/runner": { 739 - "version": "2.0.4", 740 - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", 741 - "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", 724 + "version": "2.0.5", 725 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", 726 + "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", 742 727 "dev": true, 743 728 "dependencies": { 744 - "@vitest/utils": "2.0.4", 729 + "@vitest/utils": "2.0.5", 745 730 "pathe": "^1.1.2" 746 731 }, 747 732 "funding": { ··· 749 734 } 750 735 }, 751 736 "node_modules/@vitest/snapshot": { 752 - "version": "2.0.4", 753 - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", 754 - "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", 737 + "version": "2.0.5", 738 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", 739 + "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", 755 740 "dev": true, 756 741 "dependencies": { 757 - "@vitest/pretty-format": "2.0.4", 742 + "@vitest/pretty-format": "2.0.5", 758 743 "magic-string": "^0.30.10", 759 744 "pathe": "^1.1.2" 760 745 }, ··· 763 748 } 764 749 }, 765 750 "node_modules/@vitest/spy": { 766 - "version": "2.0.4", 767 - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", 768 - "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", 751 + "version": "2.0.5", 752 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", 753 + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", 769 754 "dev": true, 770 755 "dependencies": { 771 756 "tinyspy": "^3.0.0" ··· 775 760 } 776 761 }, 777 762 "node_modules/@vitest/utils": { 778 - "version": "2.0.4", 779 - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", 780 - "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", 763 + "version": "2.0.5", 764 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", 765 + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", 781 766 "dev": true, 782 767 "dependencies": { 783 - "@vitest/pretty-format": "2.0.4", 768 + "@vitest/pretty-format": "2.0.5", 784 769 "estree-walker": "^3.0.3", 785 770 "loupe": "^3.1.1", 786 771 "tinyrainbow": "^1.2.0" ··· 1172 1157 } 1173 1158 }, 1174 1159 "node_modules/picocolors": { 1175 - "version": "1.0.1", 1176 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 1177 - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", 1160 + "version": "1.1.0", 1161 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 1162 + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 1178 1163 "dev": true 1179 1164 }, 1180 1165 "node_modules/postcss": { 1181 - "version": "8.4.40", 1182 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", 1183 - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", 1166 + "version": "8.4.45", 1167 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", 1168 + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", 1184 1169 "dev": true, 1185 1170 "funding": [ 1186 1171 { ··· 1223 1208 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1224 1209 } 1225 1210 }, 1226 - "node_modules/preact": { 1227 - "version": "10.23.1", 1228 - "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.1.tgz", 1229 - "integrity": "sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==", 1230 - "peer": true, 1231 - "funding": { 1232 - "type": "opencollective", 1233 - "url": "https://opencollective.com/preact" 1234 - } 1235 - }, 1236 1211 "node_modules/rollup": { 1237 - "version": "4.19.1", 1238 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.1.tgz", 1239 - "integrity": "sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==", 1212 + "version": "4.21.2", 1213 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", 1214 + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", 1240 1215 "dev": true, 1241 1216 "dependencies": { 1242 1217 "@types/estree": "1.0.5" ··· 1249 1224 "npm": ">=8.0.0" 1250 1225 }, 1251 1226 "optionalDependencies": { 1252 - "@rollup/rollup-android-arm-eabi": "4.19.1", 1253 - "@rollup/rollup-android-arm64": "4.19.1", 1254 - "@rollup/rollup-darwin-arm64": "4.19.1", 1255 - "@rollup/rollup-darwin-x64": "4.19.1", 1256 - "@rollup/rollup-linux-arm-gnueabihf": "4.19.1", 1257 - "@rollup/rollup-linux-arm-musleabihf": "4.19.1", 1258 - "@rollup/rollup-linux-arm64-gnu": "4.19.1", 1259 - "@rollup/rollup-linux-arm64-musl": "4.19.1", 1260 - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.1", 1261 - "@rollup/rollup-linux-riscv64-gnu": "4.19.1", 1262 - "@rollup/rollup-linux-s390x-gnu": "4.19.1", 1263 - "@rollup/rollup-linux-x64-gnu": "4.19.1", 1264 - "@rollup/rollup-linux-x64-musl": "4.19.1", 1265 - "@rollup/rollup-win32-arm64-msvc": "4.19.1", 1266 - "@rollup/rollup-win32-ia32-msvc": "4.19.1", 1267 - "@rollup/rollup-win32-x64-msvc": "4.19.1", 1227 + "@rollup/rollup-android-arm-eabi": "4.21.2", 1228 + "@rollup/rollup-android-arm64": "4.21.2", 1229 + "@rollup/rollup-darwin-arm64": "4.21.2", 1230 + "@rollup/rollup-darwin-x64": "4.21.2", 1231 + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", 1232 + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", 1233 + "@rollup/rollup-linux-arm64-gnu": "4.21.2", 1234 + "@rollup/rollup-linux-arm64-musl": "4.21.2", 1235 + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", 1236 + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", 1237 + "@rollup/rollup-linux-s390x-gnu": "4.21.2", 1238 + "@rollup/rollup-linux-x64-gnu": "4.21.2", 1239 + "@rollup/rollup-linux-x64-musl": "4.21.2", 1240 + "@rollup/rollup-win32-arm64-msvc": "4.21.2", 1241 + "@rollup/rollup-win32-ia32-msvc": "4.21.2", 1242 + "@rollup/rollup-win32-x64-msvc": "4.21.2", 1268 1243 "fsevents": "~2.3.2" 1269 1244 } 1270 1245 }, ··· 1341 1316 } 1342 1317 }, 1343 1318 "node_modules/tinybench": { 1344 - "version": "2.8.0", 1345 - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", 1346 - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", 1319 + "version": "2.9.0", 1320 + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 1321 + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 1347 1322 "dev": true 1348 1323 }, 1349 1324 "node_modules/tinypool": { 1350 - "version": "1.0.0", 1351 - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", 1352 - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", 1325 + "version": "1.0.1", 1326 + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", 1327 + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", 1353 1328 "dev": true, 1354 1329 "engines": { 1355 1330 "node": "^18.0.0 || >=20.0.0" ··· 1374 1349 } 1375 1350 }, 1376 1351 "node_modules/tslib": { 1377 - "version": "2.6.3", 1378 - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 1379 - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" 1352 + "version": "2.7.0", 1353 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", 1354 + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" 1380 1355 }, 1381 1356 "node_modules/typescript": { 1382 1357 "version": "5.5.4", ··· 1392 1367 } 1393 1368 }, 1394 1369 "node_modules/undici-types": { 1395 - "version": "6.11.1", 1396 - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.11.1.tgz", 1397 - "integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==", 1370 + "version": "6.19.8", 1371 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 1372 + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 1398 1373 "dev": true 1399 1374 }, 1400 1375 "node_modules/vite": { 1401 - "version": "5.3.5", 1402 - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", 1403 - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", 1376 + "version": "5.4.3", 1377 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", 1378 + "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", 1404 1379 "dev": true, 1405 1380 "dependencies": { 1406 1381 "esbuild": "^0.21.3", 1407 - "postcss": "^8.4.39", 1408 - "rollup": "^4.13.0" 1382 + "postcss": "^8.4.43", 1383 + "rollup": "^4.20.0" 1409 1384 }, 1410 1385 "bin": { 1411 1386 "vite": "bin/vite.js" ··· 1424 1399 "less": "*", 1425 1400 "lightningcss": "^1.21.0", 1426 1401 "sass": "*", 1402 + "sass-embedded": "*", 1427 1403 "stylus": "*", 1428 1404 "sugarss": "*", 1429 1405 "terser": "^5.4.0" ··· 1441 1417 "sass": { 1442 1418 "optional": true 1443 1419 }, 1420 + "sass-embedded": { 1421 + "optional": true 1422 + }, 1444 1423 "stylus": { 1445 1424 "optional": true 1446 1425 }, ··· 1453 1432 } 1454 1433 }, 1455 1434 "node_modules/vite-node": { 1456 - "version": "2.0.4", 1457 - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", 1458 - "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", 1435 + "version": "2.0.5", 1436 + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", 1437 + "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", 1459 1438 "dev": true, 1460 1439 "dependencies": { 1461 1440 "cac": "^6.7.14", ··· 1475 1454 } 1476 1455 }, 1477 1456 "node_modules/vitest": { 1478 - "version": "2.0.4", 1479 - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", 1480 - "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", 1457 + "version": "2.0.5", 1458 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", 1459 + "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", 1481 1460 "dev": true, 1482 1461 "dependencies": { 1483 1462 "@ampproject/remapping": "^2.3.0", 1484 - "@vitest/expect": "2.0.4", 1485 - "@vitest/pretty-format": "^2.0.4", 1486 - "@vitest/runner": "2.0.4", 1487 - "@vitest/snapshot": "2.0.4", 1488 - "@vitest/spy": "2.0.4", 1489 - "@vitest/utils": "2.0.4", 1463 + "@vitest/expect": "2.0.5", 1464 + "@vitest/pretty-format": "^2.0.5", 1465 + "@vitest/runner": "2.0.5", 1466 + "@vitest/snapshot": "2.0.5", 1467 + "@vitest/spy": "2.0.5", 1468 + "@vitest/utils": "2.0.5", 1490 1469 "chai": "^5.1.1", 1491 1470 "debug": "^4.3.5", 1492 1471 "execa": "^8.0.1", ··· 1497 1476 "tinypool": "^1.0.0", 1498 1477 "tinyrainbow": "^1.2.0", 1499 1478 "vite": "^5.0.0", 1500 - "vite-node": "2.0.4", 1479 + "vite-node": "2.0.5", 1501 1480 "why-is-node-running": "^2.3.0" 1502 1481 }, 1503 1482 "bin": { ··· 1512 1491 "peerDependencies": { 1513 1492 "@edge-runtime/vm": "*", 1514 1493 "@types/node": "^18.0.0 || >=20.0.0", 1515 - "@vitest/browser": "2.0.4", 1516 - "@vitest/ui": "2.0.4", 1494 + "@vitest/browser": "2.0.5", 1495 + "@vitest/ui": "2.0.5", 1517 1496 "happy-dom": "*", 1518 1497 "jsdom": "*" 1519 1498 },
+1 -1
core/package.json
··· 24 24 "vitest": "^2.0.4" 25 25 }, 26 26 "dependencies": { 27 - "@preact/signals": "^1.3.0", 27 + "@preact/signals-core": "^1.8.0", 28 28 "async-mutex": "^0.5.0", 29 29 "isomorphic-ws": "^5.0.0", 30 30 "nanoid": "^5.0.7",
+18
core/queue.ts
··· 47 47 } 48 48 } 49 49 50 + export class ArrayMatcher implements Matchable { 51 + matchers: Matchable[]; 52 + 53 + constructor(...matchers: Matchable[]) { 54 + this.matchers = matchers; 55 + } 56 + 57 + matches(message: IrcMessage): boolean { 58 + for (const m of this.matchers) { 59 + if (m.matches(message)) { 60 + return true; 61 + } 62 + } 63 + 64 + return false; 65 + } 66 + } 67 + 50 68 export interface Resolvable { 51 69 description: string; 52 70
+1 -1
core/soju/adapter.ts
··· 1 - import { Signal, signal } from "@preact/signals"; 1 + import { Signal, signal } from "@preact/signals-core"; 2 2 import { Adapter } from "../adapter"; 3 3 import { ConnectionConfig, ConnectionParameters } from "../connection"; 4 4 import { IrcProtocol } from "../support";
+3 -3
core/soju/connection.ts
··· 1 1 import WebSocket from "isomorphic-ws"; 2 2 import { Connection } from ".."; 3 + import { collect_caps, negotiate_caps } from "../capabilities"; 3 4 import { ConnectionErrorCode, ConnectionParameters, ConnectionState } from "../connection"; 5 + import { collect_motd } from "../motd"; 4 6 import { IrcMessage } from "../parser"; 5 - import { SojuAdapter } from "./adapter"; 6 7 import { Deferred } from "../queue"; 7 - import { collect_caps, negotiate_caps } from "../capabilities"; 8 8 import { Sasl } from "../sasl"; 9 9 import { Numeric } from "../support"; 10 - import { collect_motd } from "../motd"; 10 + import { SojuAdapter } from "./adapter"; 11 11 12 12 export class SojuConnection extends Connection { 13 13 constructor(
+3
meta.json
··· 1 + { 2 + "version": "v0 (pre-alpha)" 3 + }
+191 -647
neo/package-lock.json
··· 1 1 { 2 - "name": "tubes", 2 + "name": "neotubes", 3 3 "version": "0.0.0", 4 4 "lockfileVersion": 3, 5 5 "requires": true, ··· 29 29 } 30 30 }, 31 31 "../core": { 32 - "name": "tubes_core", 33 32 "version": "0.0.9", 34 33 "license": "ISC", 35 34 "dependencies": { ··· 61 60 } 62 61 }, 63 62 "node_modules/@antfu/install-pkg": { 64 - "version": "0.3.3", 65 - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.3.3.tgz", 66 - "integrity": "sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==", 63 + "version": "0.4.1", 64 + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", 65 + "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", 67 66 "dev": true, 68 67 "dependencies": { 69 - "@jsdevtools/ez-spawn": "^3.0.4" 68 + "package-manager-detector": "^0.2.0", 69 + "tinyexec": "^0.3.0" 70 70 }, 71 71 "funding": { 72 72 "url": "https://github.com/sponsors/antfu" ··· 95 95 } 96 96 }, 97 97 "node_modules/@babel/compat-data": { 98 - "version": "7.25.2", 99 - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", 100 - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", 98 + "version": "7.25.4", 99 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", 100 + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", 101 101 "dev": true, 102 102 "engines": { 103 103 "node": ">=6.9.0" ··· 134 134 } 135 135 }, 136 136 "node_modules/@babel/generator": { 137 - "version": "7.25.0", 138 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", 139 - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", 137 + "version": "7.25.6", 138 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", 139 + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", 140 140 "dev": true, 141 141 "dependencies": { 142 - "@babel/types": "^7.25.0", 142 + "@babel/types": "^7.25.6", 143 143 "@jridgewell/gen-mapping": "^0.3.5", 144 144 "@jridgewell/trace-mapping": "^0.3.25", 145 145 "jsesc": "^2.5.1" ··· 257 257 } 258 258 }, 259 259 "node_modules/@babel/helpers": { 260 - "version": "7.25.0", 261 - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", 262 - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", 260 + "version": "7.25.6", 261 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", 262 + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", 263 263 "dev": true, 264 264 "dependencies": { 265 265 "@babel/template": "^7.25.0", 266 - "@babel/types": "^7.25.0" 266 + "@babel/types": "^7.25.6" 267 267 }, 268 268 "engines": { 269 269 "node": ">=6.9.0" ··· 285 285 } 286 286 }, 287 287 "node_modules/@babel/parser": { 288 - "version": "7.25.0", 289 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", 290 - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", 288 + "version": "7.25.6", 289 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", 290 + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", 291 291 "dev": true, 292 + "dependencies": { 293 + "@babel/types": "^7.25.6" 294 + }, 292 295 "bin": { 293 296 "parser": "bin/babel-parser.js" 294 297 }, ··· 360 363 } 361 364 }, 362 365 "node_modules/@babel/traverse": { 363 - "version": "7.25.2", 364 - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", 365 - "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", 366 + "version": "7.25.6", 367 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", 368 + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", 366 369 "dev": true, 367 370 "dependencies": { 368 371 "@babel/code-frame": "^7.24.7", 369 - "@babel/generator": "^7.25.0", 370 - "@babel/parser": "^7.25.0", 372 + "@babel/generator": "^7.25.6", 373 + "@babel/parser": "^7.25.6", 371 374 "@babel/template": "^7.25.0", 372 - "@babel/types": "^7.25.2", 375 + "@babel/types": "^7.25.6", 373 376 "debug": "^4.3.1", 374 377 "globals": "^11.1.0" 375 378 }, ··· 378 381 } 379 382 }, 380 383 "node_modules/@babel/types": { 381 - "version": "7.25.2", 382 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", 383 - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", 384 + "version": "7.25.6", 385 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", 386 + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", 384 387 "dev": true, 385 388 "dependencies": { 386 389 "@babel/helper-string-parser": "^7.24.8", ··· 760 763 } 761 764 }, 762 765 "node_modules/@fontsource-variable/roboto-serif": { 763 - "version": "5.0.14", 764 - "resolved": "https://registry.npmjs.org/@fontsource-variable/roboto-serif/-/roboto-serif-5.0.14.tgz", 765 - "integrity": "sha512-lzjPasdqDhuDaiavHn6OB2XIxptqHroXUNwnfoDUukU9whH7SlGFyt+s6MNFmVp5ijqv14uJdiDcd1SWTqwLKQ==" 766 + "version": "5.0.15", 767 + "resolved": "https://registry.npmjs.org/@fontsource-variable/roboto-serif/-/roboto-serif-5.0.15.tgz", 768 + "integrity": "sha512-TXCktF3EYdoXzKzD44Blo/CjzdRhyToPUjF9zA+WesT3t1ZnyHNc0roI2qJH8EGb4bdTfxiICxCzwD6njkpBZQ==" 766 769 }, 767 770 "node_modules/@iconify-json/ph": { 768 - "version": "1.1.13", 769 - "resolved": "https://registry.npmjs.org/@iconify-json/ph/-/ph-1.1.13.tgz", 770 - "integrity": "sha512-xtM4JJ63HCKj09WRqrBswXiHrpliBlqboWSZH8odcmqYXbvIFceU9/Til4V+MQr6+MoUC+KB72cxhky2+A6r/g==", 771 + "version": "1.2.0", 772 + "resolved": "https://registry.npmjs.org/@iconify-json/ph/-/ph-1.2.0.tgz", 773 + "integrity": "sha512-013eLpgTmX1lACOuDnkuhC7gRHyYj9w/j8SyDmlyUYvsKQrwdRsv1otcXtwH3DevuDAzSkreeeRsCeez+gTyVA==", 771 774 "dev": true, 772 775 "dependencies": { 773 776 "@iconify/types": "*" ··· 780 783 "dev": true 781 784 }, 782 785 "node_modules/@iconify/utils": { 783 - "version": "2.1.29", 784 - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.29.tgz", 785 - "integrity": "sha512-wCcTsmlJvTi1VWBgcJ7HeuWlh7gLGWY7L9HmbgMfjOfsoo7DADemB2Nqnrw1KvCdEAxLL5wTMBAOP5BesFrtng==", 786 + "version": "2.1.32", 787 + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.32.tgz", 788 + "integrity": "sha512-LeifFZPPKu28O3AEDpYJNdEbvS4/ojAPyIW+pF/vUpJTYnbTiXUHkCh0bwgFRzKvdpb8H4Fbfd/742++MF4fPQ==", 786 789 "dev": true, 787 790 "dependencies": { 788 - "@antfu/install-pkg": "^0.1.1", 791 + "@antfu/install-pkg": "^0.4.0", 789 792 "@antfu/utils": "^0.7.10", 790 793 "@iconify/types": "^2.0.0", 791 - "debug": "^4.3.5", 794 + "debug": "^4.3.6", 792 795 "kolorist": "^1.8.0", 793 796 "local-pkg": "^0.5.0", 794 797 "mlly": "^1.7.1" 795 798 } 796 799 }, 797 - "node_modules/@iconify/utils/node_modules/@antfu/install-pkg": { 798 - "version": "0.1.1", 799 - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz", 800 - "integrity": "sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==", 801 - "dev": true, 802 - "dependencies": { 803 - "execa": "^5.1.1", 804 - "find-up": "^5.0.0" 805 - }, 806 - "funding": { 807 - "url": "https://github.com/sponsors/antfu" 808 - } 809 - }, 810 800 "node_modules/@jridgewell/gen-mapping": { 811 801 "version": "0.3.5", 812 802 "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", ··· 855 845 "@jridgewell/sourcemap-codec": "^1.4.14" 856 846 } 857 847 }, 858 - "node_modules/@jsdevtools/ez-spawn": { 859 - "version": "3.0.4", 860 - "resolved": "https://registry.npmjs.org/@jsdevtools/ez-spawn/-/ez-spawn-3.0.4.tgz", 861 - "integrity": "sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==", 862 - "dev": true, 863 - "dependencies": { 864 - "call-me-maybe": "^1.0.1", 865 - "cross-spawn": "^7.0.3", 866 - "string-argv": "^0.3.1", 867 - "type-detect": "^4.0.8" 868 - }, 869 - "engines": { 870 - "node": ">=10" 871 - } 872 - }, 873 848 "node_modules/@motionone/animation": { 874 849 "version": "10.18.0", 875 850 "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", ··· 969 944 } 970 945 }, 971 946 "node_modules/@preact/signals-core": { 972 - "version": "1.7.0", 973 - "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.7.0.tgz", 974 - "integrity": "sha512-bEZLgmJGSBVP5PUPDowhPW3bVdMmp9Tr5OEl+SQK+8Tv9T7UsIfyN905cfkmmeqw8z4xp8T6zrl4M1uj9+HAfg==", 947 + "version": "1.8.0", 948 + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.8.0.tgz", 949 + "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==", 975 950 "funding": { 976 951 "type": "opencollective", 977 952 "url": "https://opencollective.com/preact" ··· 1029 1004 } 1030 1005 }, 1031 1006 "node_modules/@rollup/rollup-android-arm-eabi": { 1032 - "version": "4.19.1", 1033 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz", 1034 - "integrity": "sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==", 1007 + "version": "4.21.2", 1008 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", 1009 + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", 1035 1010 "cpu": [ 1036 1011 "arm" 1037 1012 ], ··· 1042 1017 ] 1043 1018 }, 1044 1019 "node_modules/@rollup/rollup-android-arm64": { 1045 - "version": "4.19.1", 1046 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz", 1047 - "integrity": "sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==", 1020 + "version": "4.21.2", 1021 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", 1022 + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", 1048 1023 "cpu": [ 1049 1024 "arm64" 1050 1025 ], ··· 1055 1030 ] 1056 1031 }, 1057 1032 "node_modules/@rollup/rollup-darwin-arm64": { 1058 - "version": "4.19.1", 1059 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz", 1060 - "integrity": "sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==", 1033 + "version": "4.21.2", 1034 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", 1035 + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", 1061 1036 "cpu": [ 1062 1037 "arm64" 1063 1038 ], ··· 1068 1043 ] 1069 1044 }, 1070 1045 "node_modules/@rollup/rollup-darwin-x64": { 1071 - "version": "4.19.1", 1072 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz", 1073 - "integrity": "sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==", 1046 + "version": "4.21.2", 1047 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", 1048 + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", 1074 1049 "cpu": [ 1075 1050 "x64" 1076 1051 ], ··· 1081 1056 ] 1082 1057 }, 1083 1058 "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1084 - "version": "4.19.1", 1085 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz", 1086 - "integrity": "sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==", 1059 + "version": "4.21.2", 1060 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", 1061 + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", 1087 1062 "cpu": [ 1088 1063 "arm" 1089 1064 ], ··· 1094 1069 ] 1095 1070 }, 1096 1071 "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1097 - "version": "4.19.1", 1098 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz", 1099 - "integrity": "sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==", 1072 + "version": "4.21.2", 1073 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", 1074 + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", 1100 1075 "cpu": [ 1101 1076 "arm" 1102 1077 ], ··· 1107 1082 ] 1108 1083 }, 1109 1084 "node_modules/@rollup/rollup-linux-arm64-gnu": { 1110 - "version": "4.19.1", 1111 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz", 1112 - "integrity": "sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==", 1085 + "version": "4.21.2", 1086 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", 1087 + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", 1113 1088 "cpu": [ 1114 1089 "arm64" 1115 1090 ], ··· 1120 1095 ] 1121 1096 }, 1122 1097 "node_modules/@rollup/rollup-linux-arm64-musl": { 1123 - "version": "4.19.1", 1124 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz", 1125 - "integrity": "sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==", 1098 + "version": "4.21.2", 1099 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", 1100 + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", 1126 1101 "cpu": [ 1127 1102 "arm64" 1128 1103 ], ··· 1133 1108 ] 1134 1109 }, 1135 1110 "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1136 - "version": "4.19.1", 1137 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz", 1138 - "integrity": "sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==", 1111 + "version": "4.21.2", 1112 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", 1113 + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", 1139 1114 "cpu": [ 1140 1115 "ppc64" 1141 1116 ], ··· 1146 1121 ] 1147 1122 }, 1148 1123 "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1149 - "version": "4.19.1", 1150 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz", 1151 - "integrity": "sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==", 1124 + "version": "4.21.2", 1125 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", 1126 + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", 1152 1127 "cpu": [ 1153 1128 "riscv64" 1154 1129 ], ··· 1159 1134 ] 1160 1135 }, 1161 1136 "node_modules/@rollup/rollup-linux-s390x-gnu": { 1162 - "version": "4.19.1", 1163 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz", 1164 - "integrity": "sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==", 1137 + "version": "4.21.2", 1138 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", 1139 + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", 1165 1140 "cpu": [ 1166 1141 "s390x" 1167 1142 ], ··· 1172 1147 ] 1173 1148 }, 1174 1149 "node_modules/@rollup/rollup-linux-x64-gnu": { 1175 - "version": "4.19.1", 1176 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz", 1177 - "integrity": "sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==", 1150 + "version": "4.21.2", 1151 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", 1152 + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", 1178 1153 "cpu": [ 1179 1154 "x64" 1180 1155 ], ··· 1185 1160 ] 1186 1161 }, 1187 1162 "node_modules/@rollup/rollup-linux-x64-musl": { 1188 - "version": "4.19.1", 1189 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz", 1190 - "integrity": "sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==", 1163 + "version": "4.21.2", 1164 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", 1165 + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", 1191 1166 "cpu": [ 1192 1167 "x64" 1193 1168 ], ··· 1198 1173 ] 1199 1174 }, 1200 1175 "node_modules/@rollup/rollup-win32-arm64-msvc": { 1201 - "version": "4.19.1", 1202 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz", 1203 - "integrity": "sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==", 1176 + "version": "4.21.2", 1177 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", 1178 + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", 1204 1179 "cpu": [ 1205 1180 "arm64" 1206 1181 ], ··· 1211 1186 ] 1212 1187 }, 1213 1188 "node_modules/@rollup/rollup-win32-ia32-msvc": { 1214 - "version": "4.19.1", 1215 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz", 1216 - "integrity": "sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==", 1189 + "version": "4.21.2", 1190 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", 1191 + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", 1217 1192 "cpu": [ 1218 1193 "ia32" 1219 1194 ], ··· 1224 1199 ] 1225 1200 }, 1226 1201 "node_modules/@rollup/rollup-win32-x64-msvc": { 1227 - "version": "4.19.1", 1228 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz", 1229 - "integrity": "sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==", 1202 + "version": "4.21.2", 1203 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", 1204 + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", 1230 1205 "cpu": [ 1231 1206 "x64" 1232 1207 ], ··· 1456 1431 "dev": true 1457 1432 }, 1458 1433 "node_modules/@types/node": { 1459 - "version": "20.14.13", 1460 - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.13.tgz", 1461 - "integrity": "sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==", 1434 + "version": "20.16.5", 1435 + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", 1436 + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", 1462 1437 "dev": true, 1463 1438 "dependencies": { 1464 - "undici-types": "~5.26.4" 1439 + "undici-types": "~6.19.2" 1465 1440 } 1466 1441 }, 1467 1442 "node_modules/acorn": { ··· 1488 1463 "node": ">=4" 1489 1464 } 1490 1465 }, 1491 - "node_modules/anymatch": { 1492 - "version": "3.1.3", 1493 - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1494 - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1495 - "dev": true, 1496 - "dependencies": { 1497 - "normalize-path": "^3.0.0", 1498 - "picomatch": "^2.0.4" 1499 - }, 1500 - "engines": { 1501 - "node": ">= 8" 1502 - } 1503 - }, 1504 1466 "node_modules/argparse": { 1505 1467 "version": "2.0.1", 1506 1468 "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", ··· 1524 1486 "@babel/core": "^7.12.10" 1525 1487 } 1526 1488 }, 1527 - "node_modules/binary-extensions": { 1528 - "version": "2.3.0", 1529 - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 1530 - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1531 - "dev": true, 1532 - "engines": { 1533 - "node": ">=8" 1534 - }, 1535 - "funding": { 1536 - "url": "https://github.com/sponsors/sindresorhus" 1537 - } 1538 - }, 1539 1489 "node_modules/boolbase": { 1540 1490 "version": "1.0.0", 1541 1491 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 1542 1492 "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 1543 1493 "dev": true 1544 1494 }, 1545 - "node_modules/braces": { 1546 - "version": "3.0.3", 1547 - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1548 - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1549 - "dev": true, 1550 - "dependencies": { 1551 - "fill-range": "^7.1.1" 1552 - }, 1553 - "engines": { 1554 - "node": ">=8" 1555 - } 1556 - }, 1557 1495 "node_modules/browserslist": { 1558 - "version": "4.23.2", 1559 - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", 1560 - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", 1496 + "version": "4.23.3", 1497 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", 1498 + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", 1561 1499 "dev": true, 1562 1500 "funding": [ 1563 1501 { ··· 1574 1512 } 1575 1513 ], 1576 1514 "dependencies": { 1577 - "caniuse-lite": "^1.0.30001640", 1578 - "electron-to-chromium": "^1.4.820", 1579 - "node-releases": "^2.0.14", 1515 + "caniuse-lite": "^1.0.30001646", 1516 + "electron-to-chromium": "^1.5.4", 1517 + "node-releases": "^2.0.18", 1580 1518 "update-browserslist-db": "^1.1.0" 1581 1519 }, 1582 1520 "bin": { ··· 1585 1523 "engines": { 1586 1524 "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1587 1525 } 1588 - }, 1589 - "node_modules/call-me-maybe": { 1590 - "version": "1.0.2", 1591 - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", 1592 - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", 1593 - "dev": true 1594 1526 }, 1595 1527 "node_modules/callsites": { 1596 1528 "version": "3.1.0", ··· 1614 1546 } 1615 1547 }, 1616 1548 "node_modules/caniuse-lite": { 1617 - "version": "1.0.30001644", 1618 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001644.tgz", 1619 - "integrity": "sha512-YGvlOZB4QhZuiis+ETS0VXR+MExbFf4fZYYeMTEE0aTQd/RdIjkTyZjLrbYVKnHzppDvnOhritRVv+i7Go6mHw==", 1549 + "version": "1.0.30001657", 1550 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001657.tgz", 1551 + "integrity": "sha512-DPbJAlP8/BAXy3IgiWmZKItubb3TYGP0WscQQlVGIfT4s/YlFYVuJgyOsQNP7rJRChx/qdMeLJQJP0Sgg2yjNA==", 1620 1552 "dev": true, 1621 1553 "funding": [ 1622 1554 { ··· 1647 1579 "node": ">=4" 1648 1580 } 1649 1581 }, 1650 - "node_modules/chokidar": { 1651 - "version": "3.6.0", 1652 - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 1653 - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 1654 - "dev": true, 1655 - "dependencies": { 1656 - "anymatch": "~3.1.2", 1657 - "braces": "~3.0.2", 1658 - "glob-parent": "~5.1.2", 1659 - "is-binary-path": "~2.1.0", 1660 - "is-glob": "~4.0.1", 1661 - "normalize-path": "~3.0.0", 1662 - "readdirp": "~3.6.0" 1663 - }, 1664 - "engines": { 1665 - "node": ">= 8.10.0" 1666 - }, 1667 - "funding": { 1668 - "url": "https://paulmillr.com/funding/" 1669 - }, 1670 - "optionalDependencies": { 1671 - "fsevents": "~2.3.2" 1672 - } 1673 - }, 1674 1582 "node_modules/color-convert": { 1675 1583 "version": "1.9.3", 1676 1584 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", ··· 1724 1632 } 1725 1633 } 1726 1634 }, 1727 - "node_modules/cross-spawn": { 1728 - "version": "7.0.3", 1729 - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1730 - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1731 - "dev": true, 1732 - "dependencies": { 1733 - "path-key": "^3.1.0", 1734 - "shebang-command": "^2.0.0", 1735 - "which": "^2.0.1" 1736 - }, 1737 - "engines": { 1738 - "node": ">= 8" 1739 - } 1740 - }, 1741 1635 "node_modules/css-select": { 1742 1636 "version": "5.1.0", 1743 1637 "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", ··· 1854 1748 } 1855 1749 }, 1856 1750 "node_modules/electron-to-chromium": { 1857 - "version": "1.5.3", 1858 - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.3.tgz", 1859 - "integrity": "sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==", 1751 + "version": "1.5.15", 1752 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.15.tgz", 1753 + "integrity": "sha512-Z4rIDoImwEJW+YYKnPul4DzqsWVqYetYVN3XqDmRpgV0mjz0hYTaeeh+8/9CL1bk3AHYmF4freW/NTiVoXA2gA==", 1860 1754 "dev": true 1861 1755 }, 1862 1756 "node_modules/entities": { ··· 1919 1813 } 1920 1814 }, 1921 1815 "node_modules/escalade": { 1922 - "version": "3.1.2", 1923 - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 1924 - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 1816 + "version": "3.2.0", 1817 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1818 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1925 1819 "dev": true, 1926 1820 "engines": { 1927 1821 "node": ">=6" ··· 1942 1836 "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1943 1837 "dev": true 1944 1838 }, 1945 - "node_modules/execa": { 1946 - "version": "5.1.1", 1947 - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 1948 - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 1949 - "dev": true, 1950 - "dependencies": { 1951 - "cross-spawn": "^7.0.3", 1952 - "get-stream": "^6.0.0", 1953 - "human-signals": "^2.1.0", 1954 - "is-stream": "^2.0.0", 1955 - "merge-stream": "^2.0.0", 1956 - "npm-run-path": "^4.0.1", 1957 - "onetime": "^5.1.2", 1958 - "signal-exit": "^3.0.3", 1959 - "strip-final-newline": "^2.0.0" 1960 - }, 1961 - "engines": { 1962 - "node": ">=10" 1963 - }, 1964 - "funding": { 1965 - "url": "https://github.com/sindresorhus/execa?sponsor=1" 1966 - } 1967 - }, 1968 - "node_modules/fill-range": { 1969 - "version": "7.1.1", 1970 - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1971 - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1972 - "dev": true, 1973 - "dependencies": { 1974 - "to-regex-range": "^5.0.1" 1975 - }, 1976 - "engines": { 1977 - "node": ">=8" 1978 - } 1979 - }, 1980 - "node_modules/find-up": { 1981 - "version": "5.0.0", 1982 - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1983 - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1984 - "dev": true, 1985 - "dependencies": { 1986 - "locate-path": "^6.0.0", 1987 - "path-exists": "^4.0.0" 1988 - }, 1989 - "engines": { 1990 - "node": ">=10" 1991 - }, 1992 - "funding": { 1993 - "url": "https://github.com/sponsors/sindresorhus" 1994 - } 1995 - }, 1996 1839 "node_modules/fsevents": { 1997 1840 "version": "2.3.3", 1998 1841 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", ··· 2025 1868 "node": ">=6.9.0" 2026 1869 } 2027 1870 }, 2028 - "node_modules/get-stream": { 2029 - "version": "6.0.1", 2030 - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 2031 - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 2032 - "dev": true, 2033 - "engines": { 2034 - "node": ">=10" 2035 - }, 2036 - "funding": { 2037 - "url": "https://github.com/sponsors/sindresorhus" 2038 - } 2039 - }, 2040 - "node_modules/glob-parent": { 2041 - "version": "5.1.2", 2042 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2043 - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2044 - "dev": true, 2045 - "dependencies": { 2046 - "is-glob": "^4.0.1" 2047 - }, 2048 - "engines": { 2049 - "node": ">= 6" 2050 - } 2051 - }, 2052 1871 "node_modules/globals": { 2053 1872 "version": "11.12.0", 2054 1873 "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", ··· 2093 1912 "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", 2094 1913 "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" 2095 1914 }, 2096 - "node_modules/human-signals": { 2097 - "version": "2.1.0", 2098 - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 2099 - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 2100 - "dev": true, 2101 - "engines": { 2102 - "node": ">=10.17.0" 2103 - } 2104 - }, 2105 1915 "node_modules/import-fresh": { 2106 1916 "version": "3.3.0", 2107 1917 "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", ··· 2124 1934 "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 2125 1935 "dev": true 2126 1936 }, 2127 - "node_modules/is-binary-path": { 2128 - "version": "2.1.0", 2129 - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2130 - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2131 - "dev": true, 2132 - "dependencies": { 2133 - "binary-extensions": "^2.0.0" 2134 - }, 2135 - "engines": { 2136 - "node": ">=8" 2137 - } 2138 - }, 2139 1937 "node_modules/is-core-module": { 2140 - "version": "2.15.0", 2141 - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", 2142 - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", 1938 + "version": "2.15.1", 1939 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", 1940 + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", 2143 1941 "dev": true, 2144 1942 "dependencies": { 2145 1943 "hasown": "^2.0.2" ··· 2151 1949 "url": "https://github.com/sponsors/ljharb" 2152 1950 } 2153 1951 }, 2154 - "node_modules/is-extglob": { 2155 - "version": "2.1.1", 2156 - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2157 - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2158 - "dev": true, 2159 - "engines": { 2160 - "node": ">=0.10.0" 2161 - } 2162 - }, 2163 - "node_modules/is-glob": { 2164 - "version": "4.0.3", 2165 - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2166 - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2167 - "dev": true, 2168 - "dependencies": { 2169 - "is-extglob": "^2.1.1" 2170 - }, 2171 - "engines": { 2172 - "node": ">=0.10.0" 2173 - } 2174 - }, 2175 - "node_modules/is-number": { 2176 - "version": "7.0.0", 2177 - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2178 - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2179 - "dev": true, 2180 - "engines": { 2181 - "node": ">=0.12.0" 2182 - } 2183 - }, 2184 - "node_modules/is-stream": { 2185 - "version": "2.0.1", 2186 - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 2187 - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 2188 - "dev": true, 2189 - "engines": { 2190 - "node": ">=8" 2191 - }, 2192 - "funding": { 2193 - "url": "https://github.com/sponsors/sindresorhus" 2194 - } 2195 - }, 2196 - "node_modules/isexe": { 2197 - "version": "2.0.0", 2198 - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2199 - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2200 - "dev": true 2201 - }, 2202 1952 "node_modules/js-tokens": { 2203 1953 "version": "4.0.0", 2204 1954 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", ··· 2275 2025 "url": "https://github.com/sponsors/antfu" 2276 2026 } 2277 2027 }, 2278 - "node_modules/locate-path": { 2279 - "version": "6.0.0", 2280 - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2281 - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2282 - "dev": true, 2283 - "dependencies": { 2284 - "p-locate": "^5.0.0" 2285 - }, 2286 - "engines": { 2287 - "node": ">=10" 2288 - }, 2289 - "funding": { 2290 - "url": "https://github.com/sponsors/sindresorhus" 2291 - } 2292 - }, 2293 2028 "node_modules/lower-case": { 2294 2029 "version": "2.0.2", 2295 2030 "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", ··· 2320 2055 "node": ">=12" 2321 2056 } 2322 2057 }, 2323 - "node_modules/merge-stream": { 2324 - "version": "2.0.0", 2325 - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2326 - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2327 - "dev": true 2328 - }, 2329 - "node_modules/mimic-fn": { 2330 - "version": "2.1.0", 2331 - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2332 - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2333 - "dev": true, 2334 - "engines": { 2335 - "node": ">=6" 2336 - } 2337 - }, 2338 2058 "node_modules/mitt": { 2339 2059 "version": "3.0.1", 2340 2060 "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", ··· 2413 2133 "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", 2414 2134 "dev": true 2415 2135 }, 2416 - "node_modules/normalize-path": { 2417 - "version": "3.0.0", 2418 - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2419 - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2420 - "dev": true, 2421 - "engines": { 2422 - "node": ">=0.10.0" 2423 - } 2424 - }, 2425 - "node_modules/npm-run-path": { 2426 - "version": "4.0.1", 2427 - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2428 - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2429 - "dev": true, 2430 - "dependencies": { 2431 - "path-key": "^3.0.0" 2432 - }, 2433 - "engines": { 2434 - "node": ">=8" 2435 - } 2436 - }, 2437 2136 "node_modules/nth-check": { 2438 2137 "version": "2.1.1", 2439 2138 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", ··· 2446 2145 "url": "https://github.com/fb55/nth-check?sponsor=1" 2447 2146 } 2448 2147 }, 2449 - "node_modules/onetime": { 2450 - "version": "5.1.2", 2451 - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2452 - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2453 - "dev": true, 2454 - "dependencies": { 2455 - "mimic-fn": "^2.1.0" 2456 - }, 2457 - "engines": { 2458 - "node": ">=6" 2459 - }, 2460 - "funding": { 2461 - "url": "https://github.com/sponsors/sindresorhus" 2462 - } 2463 - }, 2464 - "node_modules/p-limit": { 2465 - "version": "3.1.0", 2466 - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2467 - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2468 - "dev": true, 2469 - "dependencies": { 2470 - "yocto-queue": "^0.1.0" 2471 - }, 2472 - "engines": { 2473 - "node": ">=10" 2474 - }, 2475 - "funding": { 2476 - "url": "https://github.com/sponsors/sindresorhus" 2477 - } 2478 - }, 2479 - "node_modules/p-locate": { 2480 - "version": "5.0.0", 2481 - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2482 - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2483 - "dev": true, 2484 - "dependencies": { 2485 - "p-limit": "^3.0.2" 2486 - }, 2487 - "engines": { 2488 - "node": ">=10" 2489 - }, 2490 - "funding": { 2491 - "url": "https://github.com/sponsors/sindresorhus" 2492 - } 2148 + "node_modules/package-manager-detector": { 2149 + "version": "0.2.0", 2150 + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.0.tgz", 2151 + "integrity": "sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==", 2152 + "dev": true 2493 2153 }, 2494 2154 "node_modules/parent-module": { 2495 2155 "version": "1.0.1", ··· 2521 2181 "url": "https://github.com/sponsors/sindresorhus" 2522 2182 } 2523 2183 }, 2524 - "node_modules/path-exists": { 2525 - "version": "4.0.0", 2526 - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2527 - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2528 - "dev": true, 2529 - "engines": { 2530 - "node": ">=8" 2531 - } 2532 - }, 2533 - "node_modules/path-key": { 2534 - "version": "3.1.1", 2535 - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2536 - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2537 - "dev": true, 2538 - "engines": { 2539 - "node": ">=8" 2540 - } 2541 - }, 2542 2184 "node_modules/path-parse": { 2543 2185 "version": "1.0.7", 2544 2186 "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", ··· 2561 2203 "dev": true 2562 2204 }, 2563 2205 "node_modules/picocolors": { 2564 - "version": "1.0.1", 2565 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 2566 - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", 2206 + "version": "1.1.0", 2207 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 2208 + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 2567 2209 "dev": true 2568 2210 }, 2569 2211 "node_modules/picomatch": { ··· 2579 2221 } 2580 2222 }, 2581 2223 "node_modules/pkg-types": { 2582 - "version": "1.1.3", 2583 - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", 2584 - "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", 2224 + "version": "1.2.0", 2225 + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", 2226 + "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", 2585 2227 "dev": true, 2586 2228 "dependencies": { 2587 2229 "confbox": "^0.1.7", ··· 2590 2232 } 2591 2233 }, 2592 2234 "node_modules/postcss": { 2593 - "version": "8.4.40", 2594 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", 2595 - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", 2235 + "version": "8.4.45", 2236 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", 2237 + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", 2596 2238 "dev": true, 2597 2239 "funding": [ 2598 2240 { ··· 2618 2260 } 2619 2261 }, 2620 2262 "node_modules/preact": { 2621 - "version": "10.23.1", 2622 - "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.1.tgz", 2623 - "integrity": "sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==", 2263 + "version": "10.23.2", 2264 + "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.2.tgz", 2265 + "integrity": "sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==", 2624 2266 "funding": { 2625 2267 "type": "opencollective", 2626 2268 "url": "https://opencollective.com/preact" 2627 2269 } 2628 2270 }, 2629 - "node_modules/readdirp": { 2630 - "version": "3.6.0", 2631 - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2632 - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2633 - "dev": true, 2634 - "dependencies": { 2635 - "picomatch": "^2.2.1" 2636 - }, 2637 - "engines": { 2638 - "node": ">=8.10.0" 2639 - } 2640 - }, 2641 2271 "node_modules/regexparam": { 2642 2272 "version": "3.0.0", 2643 2273 "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", ··· 2673 2303 } 2674 2304 }, 2675 2305 "node_modules/rollup": { 2676 - "version": "4.19.1", 2677 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.1.tgz", 2678 - "integrity": "sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==", 2306 + "version": "4.21.2", 2307 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", 2308 + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", 2679 2309 "dev": true, 2680 2310 "dependencies": { 2681 2311 "@types/estree": "1.0.5" ··· 2688 2318 "npm": ">=8.0.0" 2689 2319 }, 2690 2320 "optionalDependencies": { 2691 - "@rollup/rollup-android-arm-eabi": "4.19.1", 2692 - "@rollup/rollup-android-arm64": "4.19.1", 2693 - "@rollup/rollup-darwin-arm64": "4.19.1", 2694 - "@rollup/rollup-darwin-x64": "4.19.1", 2695 - "@rollup/rollup-linux-arm-gnueabihf": "4.19.1", 2696 - "@rollup/rollup-linux-arm-musleabihf": "4.19.1", 2697 - "@rollup/rollup-linux-arm64-gnu": "4.19.1", 2698 - "@rollup/rollup-linux-arm64-musl": "4.19.1", 2699 - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.1", 2700 - "@rollup/rollup-linux-riscv64-gnu": "4.19.1", 2701 - "@rollup/rollup-linux-s390x-gnu": "4.19.1", 2702 - "@rollup/rollup-linux-x64-gnu": "4.19.1", 2703 - "@rollup/rollup-linux-x64-musl": "4.19.1", 2704 - "@rollup/rollup-win32-arm64-msvc": "4.19.1", 2705 - "@rollup/rollup-win32-ia32-msvc": "4.19.1", 2706 - "@rollup/rollup-win32-x64-msvc": "4.19.1", 2321 + "@rollup/rollup-android-arm-eabi": "4.21.2", 2322 + "@rollup/rollup-android-arm64": "4.21.2", 2323 + "@rollup/rollup-darwin-arm64": "4.21.2", 2324 + "@rollup/rollup-darwin-x64": "4.21.2", 2325 + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", 2326 + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", 2327 + "@rollup/rollup-linux-arm64-gnu": "4.21.2", 2328 + "@rollup/rollup-linux-arm64-musl": "4.21.2", 2329 + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", 2330 + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", 2331 + "@rollup/rollup-linux-s390x-gnu": "4.21.2", 2332 + "@rollup/rollup-linux-x64-gnu": "4.21.2", 2333 + "@rollup/rollup-linux-x64-musl": "4.21.2", 2334 + "@rollup/rollup-win32-arm64-msvc": "4.21.2", 2335 + "@rollup/rollup-win32-ia32-msvc": "4.21.2", 2336 + "@rollup/rollup-win32-x64-msvc": "4.21.2", 2707 2337 "fsevents": "~2.3.2" 2708 2338 } 2709 2339 }, ··· 2716 2346 "semver": "bin/semver.js" 2717 2347 } 2718 2348 }, 2719 - "node_modules/shebang-command": { 2720 - "version": "2.0.0", 2721 - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2722 - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2723 - "dev": true, 2724 - "dependencies": { 2725 - "shebang-regex": "^3.0.0" 2726 - }, 2727 - "engines": { 2728 - "node": ">=8" 2729 - } 2730 - }, 2731 - "node_modules/shebang-regex": { 2732 - "version": "3.0.0", 2733 - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2734 - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2735 - "dev": true, 2736 - "engines": { 2737 - "node": ">=8" 2738 - } 2739 - }, 2740 - "node_modules/signal-exit": { 2741 - "version": "3.0.7", 2742 - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2743 - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2744 - "dev": true 2745 - }, 2746 2349 "node_modules/snake-case": { 2747 2350 "version": "3.0.4", 2748 2351 "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", ··· 2780 2383 "node": ">=16" 2781 2384 } 2782 2385 }, 2783 - "node_modules/string-argv": { 2784 - "version": "0.3.2", 2785 - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", 2786 - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", 2787 - "dev": true, 2788 - "engines": { 2789 - "node": ">=0.6.19" 2790 - } 2791 - }, 2792 - "node_modules/strip-final-newline": { 2793 - "version": "2.0.0", 2794 - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 2795 - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 2796 - "dev": true, 2797 - "engines": { 2798 - "node": ">=6" 2799 - } 2800 - }, 2801 2386 "node_modules/supports-color": { 2802 2387 "version": "5.5.0", 2803 2388 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", ··· 2828 2413 "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", 2829 2414 "dev": true 2830 2415 }, 2416 + "node_modules/tinyexec": { 2417 + "version": "0.3.0", 2418 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", 2419 + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", 2420 + "dev": true 2421 + }, 2831 2422 "node_modules/to-fast-properties": { 2832 2423 "version": "2.0.0", 2833 2424 "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", ··· 2837 2428 "node": ">=4" 2838 2429 } 2839 2430 }, 2840 - "node_modules/to-regex-range": { 2841 - "version": "5.0.1", 2842 - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2843 - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2844 - "dev": true, 2845 - "dependencies": { 2846 - "is-number": "^7.0.0" 2847 - }, 2848 - "engines": { 2849 - "node": ">=8.0" 2850 - } 2851 - }, 2852 2431 "node_modules/tslib": { 2853 - "version": "2.6.3", 2854 - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 2855 - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" 2432 + "version": "2.7.0", 2433 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", 2434 + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" 2856 2435 }, 2857 2436 "node_modules/tubes_core": { 2858 2437 "resolved": "../core", 2859 2438 "link": true 2860 2439 }, 2861 - "node_modules/type-detect": { 2862 - "version": "4.1.0", 2863 - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", 2864 - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", 2865 - "dev": true, 2866 - "engines": { 2867 - "node": ">=4" 2868 - } 2869 - }, 2870 2440 "node_modules/typescript": { 2871 2441 "version": "5.5.4", 2872 2442 "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", ··· 2887 2457 "dev": true 2888 2458 }, 2889 2459 "node_modules/undici-types": { 2890 - "version": "5.26.5", 2891 - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2892 - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 2460 + "version": "6.19.8", 2461 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 2462 + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 2893 2463 "dev": true 2894 2464 }, 2895 2465 "node_modules/unplugin": { 2896 - "version": "1.12.0", 2897 - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.12.0.tgz", 2898 - "integrity": "sha512-KeczzHl2sATPQUx1gzo+EnUkmN4VmGBYRRVOZSGvGITE9rGHRDGqft6ONceP3vgXcyJ2XjX5axG5jMWUwNCYLw==", 2466 + "version": "1.13.1", 2467 + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.13.1.tgz", 2468 + "integrity": "sha512-6Kq1iSSwg7KyjcThRUks9LuqDAKvtnioxbL9iEtB9ctTyBA5OmrB8gZd/d225VJu1w3UpUsKV7eGrvf59J7+VA==", 2899 2469 "dev": true, 2900 2470 "dependencies": { 2901 2471 "acorn": "^8.12.1", 2902 - "chokidar": "^3.6.0", 2903 - "webpack-sources": "^3.2.3", 2904 2472 "webpack-virtual-modules": "^0.6.2" 2905 2473 }, 2906 2474 "engines": { 2907 2475 "node": ">=14.0.0" 2476 + }, 2477 + "peerDependencies": { 2478 + "webpack-sources": "^3" 2479 + }, 2480 + "peerDependenciesMeta": { 2481 + "webpack-sources": { 2482 + "optional": true 2483 + } 2908 2484 } 2909 2485 }, 2910 2486 "node_modules/unplugin-icons": { 2911 - "version": "0.19.1", 2912 - "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-0.19.1.tgz", 2913 - "integrity": "sha512-a5I+wSOO5lsgc4dB2nEFaSZ4eEgQvSSR8tSR2jT69nTKiVmcK+PPU633zn2FyRf9i6vLapUiQ28GQStfzGURdg==", 2487 + "version": "0.19.3", 2488 + "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-0.19.3.tgz", 2489 + "integrity": "sha512-EUegRmsAI6+rrYr0vXjFlIP+lg4fSC4zb62zAZKx8FGXlWAGgEGBCa3JDe27aRAXhistObLPbBPhwa/0jYLFkQ==", 2914 2490 "dev": true, 2915 2491 "dependencies": { 2916 - "@antfu/install-pkg": "^0.3.3", 2492 + "@antfu/install-pkg": "^0.4.1", 2917 2493 "@antfu/utils": "^0.7.10", 2918 2494 "@iconify/utils": "^2.1.29", 2919 2495 "debug": "^4.3.6", ··· 2980 2556 } 2981 2557 }, 2982 2558 "node_modules/vite": { 2983 - "version": "5.3.5", 2984 - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", 2985 - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", 2559 + "version": "5.4.3", 2560 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", 2561 + "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", 2986 2562 "dev": true, 2987 2563 "dependencies": { 2988 2564 "esbuild": "^0.21.3", 2989 - "postcss": "^8.4.39", 2990 - "rollup": "^4.13.0" 2565 + "postcss": "^8.4.43", 2566 + "rollup": "^4.20.0" 2991 2567 }, 2992 2568 "bin": { 2993 2569 "vite": "bin/vite.js" ··· 3006 2582 "less": "*", 3007 2583 "lightningcss": "^1.21.0", 3008 2584 "sass": "*", 2585 + "sass-embedded": "*", 3009 2586 "stylus": "*", 3010 2587 "sugarss": "*", 3011 2588 "terser": "^5.4.0" ··· 3023 2600 "sass": { 3024 2601 "optional": true 3025 2602 }, 2603 + "sass-embedded": { 2604 + "optional": true 2605 + }, 3026 2606 "stylus": { 3027 2607 "optional": true 3028 2608 }, ··· 3034 2614 } 3035 2615 } 3036 2616 }, 3037 - "node_modules/webpack-sources": { 3038 - "version": "3.2.3", 3039 - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 3040 - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 3041 - "dev": true, 3042 - "engines": { 3043 - "node": ">=10.13.0" 3044 - } 3045 - }, 3046 2617 "node_modules/webpack-virtual-modules": { 3047 2618 "version": "0.6.2", 3048 2619 "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", 3049 2620 "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", 3050 2621 "dev": true 3051 2622 }, 3052 - "node_modules/which": { 3053 - "version": "2.0.2", 3054 - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3055 - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3056 - "dev": true, 3057 - "dependencies": { 3058 - "isexe": "^2.0.0" 3059 - }, 3060 - "bin": { 3061 - "node-which": "bin/node-which" 3062 - }, 3063 - "engines": { 3064 - "node": ">= 8" 3065 - } 3066 - }, 3067 2623 "node_modules/wouter-preact": { 3068 - "version": "3.3.1", 3069 - "resolved": "https://registry.npmjs.org/wouter-preact/-/wouter-preact-3.3.1.tgz", 3070 - "integrity": "sha512-X2Z8FcuRv7Gt7erEQ0hoVMUdOmM1HWF/6iy9YhyxVYluwqkoARP3cWV0TzfZVm8NcAegswW0y9In0ayoFCk5Ew==", 2624 + "version": "3.3.5", 2625 + "resolved": "https://registry.npmjs.org/wouter-preact/-/wouter-preact-3.3.5.tgz", 2626 + "integrity": "sha512-4IcH+UQusSrrhTl6xuUqbaL4FHbk3BocXdY6xGarSYOlv1/ZcZD45YMPW/Ef7hFI2ZGgMG3IER1UglhzAmBp/Q==", 3071 2627 "dependencies": { 3072 2628 "mitt": "^3.0.1", 3073 2629 "regexparam": "^3.0.0" ··· 3081 2637 "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3082 2638 "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3083 2639 "dev": true 3084 - }, 3085 - "node_modules/yocto-queue": { 3086 - "version": "0.1.0", 3087 - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3088 - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3089 - "dev": true, 3090 - "engines": { 3091 - "node": ">=10" 3092 - }, 3093 - "funding": { 3094 - "url": "https://github.com/sponsors/sindresorhus" 3095 - } 3096 2640 } 3097 2641 } 3098 2642 }
+2 -2
neo/package.json
··· 1 1 { 2 - "name": "tubes", 2 + "name": "neotubes", 3 3 "private": true, 4 4 "version": "0.0.0", 5 5 "type": "module", ··· 12 12 "@fontsource-variable/roboto-serif": "^5.0.14", 13 13 "@preact/signals": "^1.3.0", 14 14 "async-mutex": "^0.5.0", 15 + "dayjs": "^1.11.13", 15 16 "dexie": "^4.0.8", 16 17 "motion": "^10.18.0", 17 18 "preact": "^10.23.1", 18 - "tubes_core": "file:../core", 19 19 "wouter-preact": "^3.3.1" 20 20 }, 21 21 "devDependencies": {
-48
neo/src/bits/conn-config/index.tsx
··· 1 - import "@css/connection-info.css"; 2 - 3 - import { FunctionalComponent } from "preact"; 4 - import { Connection } from "tubes_core"; 5 - import { EmbiggenedSidebar } from "../sidebar/sidebar"; 6 - 7 - const ConnectionConfig 8 - : FunctionalComponent<{ conn: Connection }> 9 - = ({ conn }) => { 10 - const on_submit = (_e: SubmitEvent & { currentTarget: HTMLFormElement }) => { 11 - // const data = new FormData(e.currentTarget); 12 - } 13 - 14 - return <EmbiggenedSidebar class="connection-info"> 15 - <hgroup> 16 - <p>{conn.label}</p> 17 - <h1>Edit Connection</h1> 18 - </hgroup> 19 - <div class="sep" /> 20 - <form onSubmit={on_submit}> 21 - <h2>details</h2> 22 - <label class="form-field"> 23 - <span>label</span> 24 - <input type="text" name="label" value={conn.label} /> 25 - </label> 26 - <label class="form-field"> 27 - <span>url</span> 28 - <input type="url" name="url" value={conn.url.toString()} /> 29 - </label> 30 - <label class="form-field"> 31 - <span>nickname</span> 32 - <input type="url" name="url" value={conn.nickname} /> 33 - </label> 34 - <label class="form-field"> 35 - <span>realname</span> 36 - <input type="text" name="realname" value={conn.realname} /> 37 - </label> 38 - <label class="form-field"> 39 - <span>ident</span> 40 - <input type="text" name="username" value={conn.username} /> 41 - </label> 42 - 43 - <h2>account</h2> 44 - </form> 45 - </EmbiggenedSidebar>; 46 - } 47 - 48 - export default ConnectionConfig;
+104 -27
neo/src/bits/conn-info/index.tsx
··· 1 1 import "@css/connection-info.css"; 2 + import "@css/sidebar.css"; 2 3 3 - import { FunctionalComponent } from "preact"; 4 + import { Signal } from "@preact/signals"; 4 5 import { Connection } from "tubes_core"; 5 - import { EmbiggenedSidebar } from "../sidebar/sidebar"; 6 - import { ConnectionState } from "tubes_core/connection"; 6 + import { DialogInnards } from "../dialog"; 7 + import { SidebarItem } from "../sidebar/sidebar-item"; 8 + 9 + export enum ConnInfoPage { 10 + About, 11 + Configuration, 12 + Profile, 13 + Channels, 14 + Storage, 15 + } 7 16 8 17 const ConnectionInfo 9 - : FunctionalComponent<{ conn: Connection }> 10 - = ({ conn }) => { 11 - const state = conn.$state.value; 12 - return <EmbiggenedSidebar class="connection-info"> 13 - <hgroup> 14 - <p>{(() => { 15 - switch (state) { 16 - case ConnectionState.Disconnected: return "disconnected"; 17 - case ConnectionState.Disconnecting: return "disconnecting from"; 18 - case ConnectionState.Connecting: 19 - case ConnectionState.Registering: return "connecting to"; 20 - case ConnectionState.Connected: return "connected to"; 21 - case ConnectionState.Failed: return "aaah!!!!!"; 22 - default: return ""; 23 - } 24 - })()}</p> 25 - <h1>{conn.label}</h1> 26 - </hgroup> 27 - <div class="sep" /> 28 - <h2>Message of the Day</h2> 29 - <pre> 30 - {conn.motd} 31 - </pre> 32 - </EmbiggenedSidebar>; 18 + : DialogInnards<{ conn: Connection, page: Signal<ConnInfoPage | undefined> }> 19 + = ({ conn, page }) => { 20 + return <div class="conn-info"> 21 + <Sidebar conn={conn} page={page} /> 22 + {(() => { 23 + switch (page.value) { 24 + case ConnInfoPage.Configuration: return <ConfigurationPage conn={conn} />; 25 + case ConnInfoPage.Channels: return <ChannelsPage conn={conn} />; 26 + case ConnInfoPage.Profile: return <ProfilePage conn={conn} />; 27 + case ConnInfoPage.Storage: return <StoragePage conn={conn} />; 28 + default: return <AboutPage conn={conn} />; 29 + } 30 + })()} 31 + </div>; 33 32 } 33 + 34 + import { ConnectionState } from "tubes_core/connection"; 35 + import StorageIcon from "~icons/ph/dresser"; 36 + import ChannelsIcon from "~icons/ph/hash"; 37 + import AboutIcon from "~icons/ph/info"; 38 + import DetailsIcon from "~icons/ph/pencil-simple"; 39 + import AccountIcon from "~icons/ph/user-square"; 40 + 41 + const Sidebar = ({ conn, page }: { conn: Connection, page: Signal<ConnInfoPage | undefined> }) => { 42 + const Item = ({ value, children }: { value: ConnInfoPage, children: any }) => <SidebarItem 43 + onClick={() => page.value = value} 44 + selected={page.value == value} 45 + > 46 + {children} 47 + </SidebarItem> 48 + 49 + return <aside class="sidebar"> 50 + <hgroup> 51 + <p>{(() => { 52 + switch (conn.$state.value) { 53 + case ConnectionState.Disconnected: return "disconnected from"; 54 + case ConnectionState.Disconnecting: return "disconnecting from"; 55 + case ConnectionState.Connecting: 56 + case ConnectionState.Registering: return "connecting to"; 57 + case ConnectionState.Connected: return "connected to"; 58 + case ConnectionState.Failed: return <span style="color: var(--colour-red-700);">aahh!!!</span>; 59 + } 60 + })()}</p> 61 + <h1>{conn.label}</h1> 62 + </hgroup> 63 + <ul> 64 + <SidebarItem 65 + onClick={() => page.value = ConnInfoPage.About} 66 + selected={page.value == ConnInfoPage.About || !page.value} 67 + > 68 + About <AboutIcon /> 69 + </SidebarItem> 70 + <Item value={ConnInfoPage.Configuration}>Configuration <DetailsIcon /></Item> 71 + <Item value={ConnInfoPage.Profile}>Profile <AccountIcon /></Item> 72 + <Item value={ConnInfoPage.Channels}>Channels <ChannelsIcon /></Item> 73 + <Item value={ConnInfoPage.Storage}>Storage <StorageIcon /></Item> 74 + </ul> 75 + </aside>; 76 + } 77 + 78 + const AboutPage = ({ conn }: { conn: Connection }) => { 79 + return <div class="about-page"> 80 + <h1>{conn.label}</h1> 81 + {conn.motd && <> 82 + <h2 class="heading">Message of the Day</h2> 83 + <pre>{conn.motd}</pre> 84 + </>} 85 + </div> 86 + } 87 + 88 + const ConfigurationPage = ({ }: { conn: Connection }) => { 89 + return <div class=""> 90 + <h1>Configuration</h1> 91 + </div> 92 + } 93 + 94 + const ChannelsPage = ({ }: { conn: Connection }) => { 95 + return <div class=""> 96 + <h1>Channels</h1> 97 + </div> 98 + } 99 + 100 + const ProfilePage = ({ }: { conn: Connection }) => { 101 + return <div class=""> 102 + <h1>Profile</h1> 103 + </div> 104 + } 105 + 106 + const StoragePage = ({ }: { conn: Connection }) => { 107 + return <div class=""> 108 + <h1>Storage</h1> 109 + </div> 110 + } 34 111 35 112 export default ConnectionInfo;
+8 -6
neo/src/bits/dialog.tsx
··· 6 6 import { useLayoutEffect, useRef } from "preact/hooks"; 7 7 8 8 export type DialogControls = { open: () => void, close: (mode?: CloseReason) => void } 9 - export type DialogInnards = (props: DialogControls) => any; 9 + export type DialogInnards<T = {}> = (props: DialogControls & T) => any; 10 10 11 11 export enum CloseReason { 12 12 Cancel, 13 13 Success, 14 14 } 15 15 16 - export const create_dialog = ( 17 - Content: DialogInnards 16 + export const create_dialog = <T, >( 17 + Content: DialogInnards<T>, 18 + props?: T, 18 19 ) => { 19 20 const is_open = useSignal(false); 20 21 const dialog_ref = useRef<HTMLDialogElement>(null); ··· 34 35 : is_open.value = false; 35 36 }; 36 37 37 - const component = () => is_open.value 38 + const component = (diag_props?: any) => is_open.value 38 39 ? <> 39 40 <div class="dialog-scrim" aria-hidden /> 40 - <dialog ref={dialog_ref} class="fancy-dialog"> 41 - <Content open={open} close={close} /> 41 + <dialog ref={dialog_ref} class="fancy-dialog" {...(diag_props ?? {})}> 42 + {/* @ts-ignore probably fine */} 43 + <Content open={open} close={close} {...(props ?? {})} /> 42 44 </dialog> 43 45 </> 44 46 : <></>
+4 -3
neo/src/bits/navigator.tsx
··· 2 2 import { reduced_motion } from "@src/support"; 3 3 import { animate, spring, timeline } from "motion"; 4 4 import { ComponentChild, FunctionalComponent } from "preact"; 5 + import { HTMLProps } from "preact/compat"; 5 6 import { useLayoutEffect, useRef } from "preact/hooks"; 6 7 7 8 type Page = (controls: NavigatorControls) => ComponentChild; ··· 12 13 } 13 14 14 15 const MiniNavigator 15 - : FunctionalComponent<{ children: Page, transitions?: boolean }> 16 - = ({ children, transitions }) => { 16 + : FunctionalComponent<{ children: Page, transitions?: boolean } & HTMLProps<HTMLDivElement>> 17 + = ({ children, transitions, ...rest }) => { 17 18 const page_stack = useSignal<Page[]>([children]); 18 19 19 20 const navigator_div = useRef<HTMLDivElement>(null); ··· 59 60 console.log(first, last); 60 61 }, [page_stack.value]) 61 62 62 - return <div class="navigator" ref={navigator_div}> 63 + return <div class="navigator" ref={navigator_div} {...rest}> 63 64 {page_stack.value.at(-1)?.(controls)} 64 65 </div> 65 66 }
+3 -4
neo/src/bits/sidebar/add-network.tsx
··· 16 16 const dialog = create_dialog(AddNetworkDialog); 17 17 18 18 return <> 19 - <dialog.Component /> 19 + <dialog.Component style="max-width: 36rem; width: auto;" /> 20 20 <TextButton class="add-network" onClick={() => { dialog.open() }}> 21 21 <Plus width="15px" height="15px" /> 22 22 Add Network ··· 35 35 : DialogInnards 36 36 = (props) => { 37 37 const close = (x?: CloseReason) => { 38 - console.log("here") 39 38 dialog_state.value = {}; 40 39 props.close(x); 41 40 } ··· 135 134 return <> 136 135 <hgroup> 137 136 <h2 class="heading">Adding {dialog_state.value.url!.hostname}</h2> 138 - <p class="body-small">(second page)</p> 137 + <p class="body-small">tell us about yourself</p> 139 138 </hgroup> 140 139 141 140 <form style="margin-top: 1rem" onSubmit={(e) => { ··· 153 152 154 153 close(CloseReason.Success); 155 154 }}> 156 - <FormField label="nickname" flavour_text="this is the name that shows up next to your messages"> 155 + <FormField label="nickname" flavour_text="the name that shows up next to your messages"> 157 156 <input type="text" name="nickname" required /> 158 157 </FormField> 159 158 <FormField
+74 -74
neo/src/bits/sidebar/network-section.tsx
··· 1 1 import { useComputed, useSignal } from "@preact/signals"; 2 - import Connections from "@src/chat/conns"; 2 + import { resolve_adapter_icon } from "@src/bonus/icons"; 3 + import { adapters } from "@src/chat/adapters"; 4 + import { connection_base } from "@src/chat/conns"; 5 + import ReadMarkers from "@src/chat/read"; 3 6 import { FunctionalComponent } from "preact"; 4 7 import { Connection } from "tubes_core"; 5 8 import { ChatBuffer } from "tubes_core/channel"; 6 9 import { ConnectionErrorCode, ConnectionState } from "tubes_core/connection"; 7 - import DebugIcon from "~icons/ph/hammer"; 8 - import { IconButton, PrimaryButton, SecondaryButton, TextButton } from "../buttons"; 9 - import { ErrorMessage } from "../errors"; 10 - import FormField from "../form/form-field"; 10 + import { useLocation } from "wouter-preact"; 11 + import { IconButton, TextButton } from "../buttons"; 12 + import ConnectionInfo, { ConnInfoPage } from "../conn-info"; 13 + import { create_dialog } from "../dialog"; 11 14 import ListMenu, { ListMenuItem } from "../menu/list-menu"; 12 - import { create_popover, PopoverInnards } from "../popover"; 13 - import { sidebar_view } from "./sidebar"; 14 - import { SidebarItem, SidebarLink } from "./sidebar-item"; 15 + import { create_popover } from "../popover"; 16 + import { SidebarLink } from "./sidebar-item"; 15 17 import SidebarSection from "./sidebar-section"; 16 18 17 - import { useLocation } from "wouter-preact"; 18 19 import ArchiveIcon from "~icons/ph/archive"; 19 20 import ConnectionFailedIcon from "~icons/ph/diamond-fill"; 20 21 import EtcIcon from "~icons/ph/dots-three-bold"; 22 + import DebugIcon from "~icons/ph/hammer"; 21 23 import ConnectingIcon from "~icons/ph/hourglass-simple-fill"; 22 24 import RegisterIcon from "~icons/ph/identification-badge"; 23 25 import InfoIcon from "~icons/ph/info"; ··· 30 32 import LoginIcon from "~icons/ph/sign-in"; 31 33 32 34 export const NetworkSection: FunctionalComponent<{ conn: Connection; }> = ({ conn }) => { 33 - const errored = useComputed(() => conn.$state.value == ConnectionState.Failed); 34 - const disconnected = useComputed(() => conn.$state.value == ConnectionState.Disconnected); 35 + const errored = conn.$state.value == ConnectionState.Failed; 36 + const disconnected = conn.$state.value == ConnectionState.Disconnected; 35 37 36 - const [, set_location] = useLocation() 38 + const [, set_location] = useLocation(); 39 + 40 + const diag_page = useSignal<ConnInfoPage>(); 41 + const details_diag = create_dialog(ConnectionInfo, { 42 + conn, page: diag_page 43 + }); 37 44 38 45 const icon = useComputed(() => { 39 46 switch (conn.$state.value) { ··· 44 51 case ConnectionState.Registering: return <ConnectingIcon title="Connecting" />; 45 52 46 53 case ConnectionState.Failed: return <ConnectionFailedIcon title="Failed to Connect" />; 47 - 54 + 48 55 case ConnectionState.Connected: return <></>; 49 56 } 50 57 }); 58 + 59 + const adapter_icon = conn.adapter_id 60 + ? resolve_adapter_icon(adapters.value.find(x => x.id == conn.adapter_id)!) 61 + : undefined; 51 62 52 63 const menu = create_popover(<ListMenu> 53 64 <ListMenuItem icon={DMIcon}> ··· 73 84 {/* debug menu */} 74 85 {process.env.NODE_ENV == "development" && 75 86 <ListMenuItem 76 - onClick={() => set_location( 77 - conn.adapter_id 78 - ? `/connection/${conn.adapter_id}/${conn.id}/debug` 79 - : `/connection/${conn.id}/debug` 80 - )} 87 + onClick={() => set_location(`${connection_base(conn)}/debug`)} 81 88 icon={DebugIcon} 82 89 > 83 90 Debug ··· 85 92 86 93 87 94 {conn.supports.sasl() && <ListMenuItem 88 - onClick={() => sidebar_view.value = ["conn-config", conn]} 95 + onClick={() => { }} 89 96 icon={LoginIcon} 90 97 > 91 98 Log In 92 99 </ListMenuItem>} 93 100 94 101 {conn.supports.registration() && <ListMenuItem 95 - onClick={() => sidebar_view.value = ["conn-config", conn]} 102 + onClick={() => { }} 96 103 icon={RegisterIcon} 97 104 > 98 105 Register 99 106 </ListMenuItem>} 100 107 101 108 <ListMenuItem 102 - onClick={() => sidebar_view.value = ["conn-info", conn]} 109 + onClick={() => { details_diag.open() }} 103 110 icon={InfoIcon} 104 111 > 105 112 Details 106 113 </ListMenuItem> 107 114 108 115 <ListMenuItem 109 - onClick={() => sidebar_view.value = ["conn-config", conn]} 116 + onClick={() => { }} 110 117 icon={ConfIcon} 111 118 > 112 119 Configure ··· 115 122 <ListMenuItem destructive icon={ArchiveIcon}>Archive</ListMenuItem> 116 123 </ListMenu>); 117 124 118 - const join = create_popover(<JoinPopover conn={conn} />) 119 - 120 125 return <SidebarSection> 121 126 {/* da header */} 122 127 <header class="sidebar-section-header"> 123 128 {/* connection label */} 124 129 <h2> 125 130 <button 126 - class={`${disconnected.value ? "disconnected" : ""} ${errored.value ? "errored" : ""}`} 127 - onClick={() => sidebar_view.value = ["conn-info", conn]} 131 + class={`${disconnected ? "disconnected" : ""} ${errored ? "errored" : ""}`} 132 + onClick={() => details_diag.open()} 128 133 > 129 - {icon.value} 134 + {icon} 135 + {adapter_icon} 130 136 {conn.label} 131 137 </button> 132 138 </h2> 133 139 134 140 {/* buttons */} 135 - {errored.value || disconnected.value 141 + {errored || disconnected 136 142 ? <IconButton 137 143 title="Connect" 138 144 onClick={() => conn.connect()} ··· 141 147 </IconButton> 142 148 : <IconButton 143 149 title="Connection Info" 144 - onClick={() => sidebar_view.value = ["conn-info", conn]} 150 + onClick={() => { 151 + diag_page.value = ConnInfoPage.About; 152 + details_diag.open() 153 + }} 145 154 > 146 155 <InfoIcon aria-hidden /> 147 156 </IconButton> 148 157 } 149 158 <IconButton 150 - onClick={() => sidebar_view.value = ["conn-config", conn]} 159 + onClick={() => { 160 + diag_page.value = ConnInfoPage.Configuration; 161 + details_diag.open() 162 + }} 151 163 title="Configure" 152 164 > 153 165 <ConfIcon aria-hidden /> ··· 158 170 </header> 159 171 160 172 {/* error message if there is one */} 161 - {errored.value && <div class="connection-error"><ConnErrorMessage conn={conn} /></div>} 173 + {errored && <div class="connection-error"><ConnErrorMessage conn={conn} /></div>} 162 174 163 175 {/* list of buffers */} 164 176 <ul class="sidebar-list"> 165 177 {/* buffers */} 166 178 {conn.$buffers.value.map(x => <BufferListItem buffer={x} />)} 167 179 168 - <join.Popover /> 169 - <SidebarItem onClick={join.open}> 180 + <SidebarLink to={`${connection_base(conn)}/join`}> 170 181 Join Channel <JoinIcon /> 171 - </SidebarItem> 182 + </SidebarLink> 172 183 </ul> 184 + 185 + <details_diag.Component style="max-width: 90vw; width: auto; padding: 0;" /> 173 186 </SidebarSection>; 174 187 }; 175 188 176 189 const BufferListItem: FunctionalComponent<{ buffer: ChatBuffer; }> = ({ buffer }) => { 177 - return <SidebarLink 178 - to={buffer.conn.adapter_id 179 - ? `/connection/${buffer.conn.adapter_id}/${buffer.conn.id}/${buffer.name}` 180 - : `/connection/${buffer.conn.id}/${buffer.name}`} 181 - > 190 + const marker = ReadMarkers.get(buffer.name, buffer.conn); 191 + return <SidebarLink to={`${connection_base(buffer.conn)}/channel/${buffer.name}`}> 182 192 {buffer.name} 193 + {marker.unread_count.value != 0 && 194 + <span class="unread-marker" aria-label={`${marker.unread_count.value} unread`}> 195 + {marker.unread_count} 196 + </span>} 183 197 </SidebarLink>; 184 198 }; 185 199 ··· 187 201 switch (conn.$error.value?.[0]) { 188 202 case ConnectionErrorCode.NickTaken: return <NickTaken conn={conn} /> 189 203 case ConnectionErrorCode.SocketError: return <SocketError conn={conn} /> 204 + case ConnectionErrorCode.Banned: return <Banned conn={conn} /> 190 205 // case ConnectionError.SaslFailed: 191 206 // case ConnectionError.SaslTooLong: 192 207 // case ConnectionError.SaslAborted: ··· 241 256 </>; 242 257 } 243 258 244 - const JoinPopover: FunctionalComponent<{ conn: Connection }> = ({ conn }) => { 245 - const error = useSignal(""); 246 - const on_submit = async (e: SubmitEvent & { currentTarget: HTMLFormElement }) => { 247 - e.preventDefault(); 248 - try { 249 - const data = new FormData(e.currentTarget); 250 - const channel_name = data.get("channel"); 251 - if (!channel_name || typeof channel_name != "string") { 252 - return; 253 - } 254 - Connections.add_autojoin(channel_name, conn); 255 - await conn.join_channel(channel_name); 256 - } catch (e) { 257 - if (e instanceof Error) { 258 - error.value = e.message; 259 - } 260 - } 261 - } 259 + const Banned: FunctionalComponent<{ conn: Connection }> = ({ conn }) => { 260 + const reason = conn.$error.value?.[1]; 261 + const reason_text = reason?.params?.at(-1); 262 262 263 - return <PopoverInnards> 264 - <hgroup> 265 - <h2 class="heading">Join a Channel</h2> 266 - <p class="subtitle">channels are where the talking occurs.</p> 267 - </hgroup> 268 - <form onSubmit={on_submit} style="margin-top: 2rem;"> 269 - <FormField label="Name"> 270 - <input type="text" name="channel" placeholder="e.g. #example" /> 271 - </FormField> 272 - {error.value && <ErrorMessage>{error}</ErrorMessage>} 273 - <div class="button-row" style="margin-top: .75rem;"> 274 - <SecondaryButton onClick={() => { }} type="button">Nevermind</SecondaryButton> 275 - <PrimaryButton type="submit">Join</PrimaryButton> 276 - </div> 277 - </form> 278 - </PopoverInnards>; 263 + return <> 264 + <h3>Banned</h3> 265 + <p class="body-small low-emphasis"> 266 + You have been banned from connecting to {conn.url}. 267 + </p> 268 + 269 + {reason && reason_text && <blockquote class="body-small low-emphasis"> 270 + <p>{reason_text}</p> 271 + <footer>—{reason.source?.nick ?? "Anonymous"}</footer> 272 + </blockquote>} 273 + 274 + 275 + <div class="buttons"> 276 + <TextButton onClick={() => conn.connect()}>Try Again</TextButton> 277 + <TextButton>Configure</TextButton> 278 + </div> 279 + </>; 279 280 } 280 -
+1 -47
neo/src/bits/sidebar/sidebar.tsx
··· 1 - import { signal } from "@preact/signals"; 2 1 import { FunctionalComponent } from "preact"; 3 2 4 3 import Connections from "@src/chat/conns"; 5 4 import { SidebarHeader } from "./sidebar-header"; 6 5 7 6 import "@css/sidebar.css"; 8 - import { useEffect, useRef } from "preact/hooks"; 9 - import type { Connection } from "tubes_core"; 10 - import ConnectionConfig from "../conn-config"; 11 - import ConnectionInfo from "../conn-info"; 12 - import { NetworkSection } from "./network-section"; 13 7 import { AddNetworkButton } from "./add-network"; 8 + import { NetworkSection } from "./network-section"; 14 9 import SidebarFooter from "./sidebar-footer"; 15 10 16 - type SidebarView 17 - = "main" 18 - | "add-network" 19 - | ["conn-info", Connection] 20 - | ["conn-config", Connection] 21 - 22 - export const sidebar_view = signal<SidebarView>("main") 23 - 24 11 export const Sidebar: FunctionalComponent = ({ }) => { 25 - const view = sidebar_view.value; 26 - 27 - if (view instanceof Array && view[0] == "conn-info") { 28 - return <ConnectionInfo conn={view[1]} /> 29 - } 30 - 31 - if (view instanceof Array && view[0] == "conn-config") { 32 - return <ConnectionConfig conn={view[1]} /> 33 - } 34 - 35 12 return <> 36 13 <aside class="main-sidebar"> 37 14 <SidebarHeader /> ··· 41 18 <SidebarFooter /> 42 19 </> 43 20 } 44 - 45 - export const EmbiggenedSidebar 46 - : FunctionalComponent<{ [k: string]: any }> 47 - = ({ children, ...rest }) => { 48 - const ref = useRef<HTMLDialogElement>(null); 49 - 50 - useEffect(() => { 51 - ref.current?.showModal(); 52 - // window.addEventListener('click', (e) => { 53 - // // todo: click outside 2 close 54 - // }); 55 - 56 - ref.current?.addEventListener("close", () => { 57 - sidebar_view.value = "main"; 58 - }) 59 - }); 60 - 61 - return <aside class="main-sidebar"> 62 - <dialog ref={ref} {...rest}> 63 - {children} 64 - </dialog> 65 - </aside> 66 - }
+8
neo/src/bonus/icons/index.tsx
··· 1 + import { Adapter } from "tubes_core/adapter"; 2 + import { SojuAdapter } from "tubes_core/soju/adapter"; 3 + 4 + export const resolve_adapter_icon = (adapter: Adapter) => { 5 + switch (true) { 6 + case adapter instanceof SojuAdapter: return ""; 7 + } 8 + }
neo/src/bonus/icons/soju.svg

This is a binary file and will not be displayed.

+45 -23
neo/src/buffer/input.tsx
··· 1 1 import { useComputed, useSignal } from "@preact/signals"; 2 2 import { FunctionalComponent } from "preact"; 3 + import { IrcMessage } from "tubes_core/parser"; 3 4 import Add from "~icons/ph/plus"; 4 5 import Emoji from "~icons/ph/smiley"; 6 + import ErrorIcon from "~icons/ph/diamond-fill"; 7 + import DismissIcon from "~icons/ph/check-bold"; 5 8 6 9 const MessageInput 7 10 : FunctionalComponent<{ 8 - onSubmit: (msg: string, is_command: boolean) => void, 11 + onSubmit: (msg: string, is_command: boolean) => Promise<void> | void, 9 12 is_scrolled: boolean 10 13 }> 11 14 = ({ onSubmit: onSend, is_scrolled }) => { 12 15 const input = useSignal(""); 13 16 const is_command = useComputed(() => input.value.charAt(0) == "/"); 17 + const error = useSignal<string>(); 14 18 15 - return <form 16 - class={` 17 - message-input 18 - ${is_scrolled ? "scrolled" : ""} 19 - ${is_command.value ? "command" : ""} 20 - `} 21 - onSubmit={(e) => { 19 + return <form style="grid-column: 1 / -1; display: grid; grid-template-columns: subgrid;" 20 + onSubmit={async (e) => { 22 21 e.preventDefault(); 23 - onSend(input.value, is_command.value); 22 + try { 23 + await onSend(input.value, is_command.value); 24 + } catch (e) { 25 + if (e instanceof Error) { 26 + error.value = e.message; 27 + } 28 + if (e instanceof IrcMessage) { 29 + error.value = e.content ?? e.params?.at(-1); 30 + } 31 + return; 32 + } 24 33 input.value = ""; 25 34 }} 26 35 > 27 - <button class="prefix" type="button"> 28 - <Add width="17px" /> 29 - </button> 30 - <div class="input"> 31 - <input 32 - type="text" 33 - label="Message Input" 34 - placeholder="say something to #tubes" 35 - value={input.value} 36 - onInput={(e) => input.value = e.currentTarget.value} 37 - /> 36 + <div class={` 37 + message-input 38 + ${is_scrolled ? "scrolled" : ""} 39 + ${is_command.value ? "command" : ""} 40 + `}> 41 + <button class="prefix" type="button"> 42 + <Add width="17px" /> 43 + </button> 44 + <div class="input"> 45 + <input 46 + type="text" 47 + label="Message Input" 48 + placeholder="say something to #tubes" 49 + value={input.value} 50 + onInput={(e) => input.value = e.currentTarget.value} 51 + /> 52 + {is_command.value && <div class="command-ghost" aria-hidden> 53 + {input.value.split(" ")[0]} 54 + </div>} 55 + </div> 56 + <button class="suffix" type="button"> 57 + <Emoji width="18px" /> 58 + </button> 38 59 </div> 39 - <button class="suffix" type="button"> 40 - <Emoji width="18px" /> 41 - </button> 60 + {error.value && <p class="input-error" aria-live="assertive" role="alert"> 61 + <ErrorIcon /> <span>{error}</span> 62 + <button onClick={() => error.value = undefined}>oh okay <DismissIcon /></button> 63 + </p>} 42 64 </form>; 43 65 } 44 66
+96
neo/src/buffer/list-elements.tsx
··· 1 + import { pick_colour } from "@src/chat/colours"; 2 + import { FunctionalComponent } from "preact"; 3 + import { useContext } from "preact/hooks"; 4 + import { IrcMessage } from "tubes_core/parser"; 5 + import dayjs from 'dayjs' 6 + import advanced_format from 'dayjs/plugin/advancedFormat'; 7 + 8 + dayjs.extend(advanced_format); 9 + 10 + export const DateSeperator 11 + : FunctionalComponent<{ timestamp: Date }> 12 + = ({ timestamp }) => { 13 + return <div class="date-sep" role="separator"> 14 + {timestamp.toLocaleDateString(undefined, { dateStyle: "full" })} 15 + </div> 16 + } 17 + 18 + export const UnreadSeperator = () => <div class="unread-sep" role="separator"> 19 + <span>new!</span> 20 + </div> 21 + 22 + export const Message: FunctionalComponent<{ msg: IrcMessage }> = ({ msg }) => { 23 + const nick = msg.source?.nick; 24 + if (!nick) return <></>; 25 + 26 + const colour = pick_colour(nick.toString()); 27 + const style = ` 28 + --hover: var(--colour-${colour}-50); 29 + --selection: var(--colour-${colour}-700); 30 + `; 31 + const date_string = msg.timestamp?.toLocaleString(undefined, { 32 + dateStyle: "full", 33 + timeStyle: "medium", 34 + }); 35 + 36 + if (msg.is_action) { 37 + return <li style={style}> 38 + <div class="left-bit"> 39 + <time datetime={msg.timestamp?.toDateString()} title={date_string}> 40 + {msg.timestamp?.toLocaleTimeString(undefined, { timeStyle: "short" })} 41 + </time> 42 + <span class="name action">*</span> 43 + </div> 44 + <p><Nick nick={nick} colour={colour} max_length={Infinity} /> {msg.content}</p> 45 + </li>; 46 + } 47 + 48 + switch (msg.command) { 49 + case "PRIVMSG": return <li style={style}> 50 + <div class="left-bit"> 51 + <time datetime={msg.timestamp?.toDateString()} title={date_string}> 52 + {msg.timestamp?.toLocaleTimeString(undefined, { timeStyle: "short" })} 53 + </time> 54 + <Nick nick={nick} colour={colour} /> 55 + </div> 56 + <p>{msg.content}</p> 57 + </li>; 58 + 59 + // default: return <li><span class="name">⚠️</span> <p>{msg.toString()}</p></li> 60 + } 61 + return <></> 62 + } 63 + 64 + import { useComputed } from "@preact/signals"; 65 + import { IrcChannel } from "tubes_core/channel"; 66 + import GoneIcon from "~icons/ph/arrow-left"; 67 + import { BufferContext } from "./view"; 68 + 69 + export const Nick 70 + : FunctionalComponent<{ colour?: string, nick: string, max_length?: number }> 71 + = ({ colour, nick, max_length: max_len }) => { 72 + const buffer = useContext(BufferContext); 73 + const gone = useComputed(() => { 74 + return buffer instanceof IrcChannel 75 + && !buffer.$members.value.includes(nick) 76 + && nick != buffer.conn.nickname; 77 + }); 78 + 79 + max_len = max_len ?? (gone.value ? 7 : 10); 80 + 81 + return <> 82 + {gone.value && <GoneIcon width="12px" height="12px" />} 83 + 84 + <span 85 + class={` 86 + name 87 + ${gone.value ? "gone" : ""} 88 + ${nick.length > max_len ? "squish" : ""} 89 + `} 90 + style={`--colour: var(--colour-${colour}-700)`} 91 + title={nick} 92 + > 93 + {nick} 94 + </span> 95 + </> 96 + }
-3
neo/src/buffer/squisher.ts
··· 1 - function squish_messages() { 2 - 3 - }
+48
neo/src/buffer/squisher.tsx
··· 1 + import ReadMarkers from "@src/chat/read"; 2 + import { ChatBuffer } from "tubes_core/channel"; 3 + import { IrcMessage } from "tubes_core/parser"; 4 + import { DateSeperator, Message, UnreadSeperator } from "./list-elements"; 5 + 6 + const cmp_msgs = (a: IrcMessage, b: IrcMessage) => cmp_msgid(a, b) 7 + || a.timestamp?.getTime() == b.timestamp?.getTime() 8 + 9 + 10 + const cmp_msgid = (a: IrcMessage, b: IrcMessage) => 11 + a?.tags?.["msgid"] 12 + && b.tags?.["msgid"] 13 + && (a?.tags?.["msgid"] == b?.tags?.["msgid"]) 14 + 15 + export function squish_messages(buffer: ChatBuffer, list: IrcMessage[], previous?: IrcMessage) { 16 + const marker = ReadMarkers.get(buffer.name, buffer.conn); 17 + const last = list.findLast(x => x.command == "PRIVMSG" || x.command == "NOTICE"); 18 + 19 + const acc = []; 20 + for (const current of list) { 21 + if (diff_dates(current, previous)) { 22 + acc.push(<DateSeperator timestamp={current.timestamp!} />); 23 + } 24 + 25 + acc.push(<Message msg={current} />); 26 + 27 + const last_read = marker.last_read.value; 28 + if (last_read && last && cmp_msgs(last_read, current) && !cmp_msgs(last, last_read)) { 29 + acc.push(<UnreadSeperator />) 30 + } 31 + 32 + previous = current; 33 + } 34 + 35 + return acc; 36 + } 37 + 38 + function diff_dates(current: IrcMessage, previous?: IrcMessage) { 39 + if (current.command != "PRIVMSG" && current.command != "NOTICE") return; 40 + 41 + const t1 = current.timestamp; 42 + const t2 = previous?.timestamp; 43 + if (!t1 || !t2) return; 44 + 45 + return t1.getDay() > t2.getDay() 46 + || t1.getMonth() > t2.getMonth() 47 + || t1.getFullYear() > t2.getFullYear(); 48 + }
+78 -108
neo/src/buffer/view.tsx
··· 1 1 import "@css/messages.css"; 2 - import { useComputed, useSignal } from "@preact/signals"; 3 - import { pick_colour } from "@src/chat/colours"; 2 + import { Signal, useSignal } from "@preact/signals"; 3 + import { execute_command } from "@src/chat/commands"; 4 + import ReadMarkers, { ReadMarker } from "@src/chat/read"; 5 + import { store_message } from "@src/storage"; 6 + import { message_style } from "@src/support"; 4 7 import { FunctionalComponent, RefObject, createContext } from "preact"; 5 - import { useContext, useEffect, useMemo, useRef } from "preact/hooks"; 8 + import { useEffect, useRef } from "preact/hooks"; 6 9 import { ChatBuffer, IrcChannel } from "tubes_core/channel"; 7 - import { IrcMessage, extract_content } from "tubes_core/parser"; 10 + import { IrcMessage } from "tubes_core/parser"; 8 11 import MessageInput from "./input"; 9 12 13 + import { HTMLProps } from "preact/compat"; 14 + import Trangle from "~icons/ph/triangle-fill"; 15 + import { squish_messages } from "./squisher"; 16 + 10 17 async function load_msgs(buffer: ChatBuffer, limit = 100): Promise<IrcMessage[]> { 11 18 let count = 0; 12 19 const acc = []; 13 20 for await (const msg of buffer) { 14 - acc.push(msg); 21 + acc.push(IrcMessage.hydrate(msg)); 15 22 if (count++ >= limit) break; 16 23 } 17 24 18 25 return acc; 19 26 } 20 27 21 - import { execute_command } from "@src/chat/commands"; 22 - import { store_message } from "@src/storage"; 23 - import Trangle from "~icons/ph/triangle-fill"; 24 - 25 - const StartOfHistory: FunctionalComponent<{ buffer: ChatBuffer }> = ({ buffer }) => { 26 - const chathistory = buffer.conn.capabilities.has("draft/chathistory"); 27 - return <div className="message-list-start"> 28 - <b>{buffer.name}</b> 29 - <p class="subtitle">this is the start of the channel's logs.</p> 30 - {!chathistory && 31 - <p class="chathistory-warning"> 32 - <Trangle aria-hidden /> Messages sent while Tubes was closed might not be shown. 33 - <a href="/">Learn More</a> 34 - </p>} 35 - 36 - </div> 37 - } 28 + export const BufferContext = createContext<ChatBuffer | null>(null); 38 29 39 30 const BufferView: FunctionalComponent<{ buffer: ChatBuffer }> = ({ buffer }) => { 40 31 const msgs = useSignal<IrcMessage[]>([]); 41 - const is_scrolled = useSignal(false); 32 + const marker = ReadMarkers.get(buffer.name, buffer.conn); 42 33 const is_loading = useSignal(false); 43 34 const finished_init = useSignal(false); 44 35 const list_elem = useRef<HTMLUListElement>(null); ··· 46 37 const to_bottom = () => list_elem.current?.scroll({ top: list_elem.current?.scrollHeight }); 47 38 48 39 // re-init the state when the buffer changes 49 - useMemo(() => { 40 + useEffect(() => { 41 + marker.focused.value = true; 42 + 50 43 finished_init.value = false; 51 - is_scrolled.value = false; 52 44 msgs.value = []; 53 45 to_bottom(); 54 46 ··· 57 49 finished_init.value = true; 58 50 to_bottom(); 59 51 }); 52 + 53 + return () => { 54 + marker.focused.value = false; 55 + marker.last_read.value = msgs.value.findLast(x => x.command == "PRIVMSG" || x.command == "NOTICE"); 56 + 57 + } 60 58 }, [buffer]); 61 59 62 60 // append incoming messages into the msgs array ··· 66 64 67 65 // when a new message comes in, scroll it into view 68 66 useEffect(() => { 69 - if (!is_scrolled.value) to_bottom(); 67 + if (marker.focused.value) to_bottom(); 70 68 }, [msgs.value]); 71 69 72 70 return <BufferContext.Provider value={buffer}> 73 71 <div class={`message-list ${message_style.value}`}> 74 72 {buffer instanceof IrcChannel ? <ChannelHeader channel={buffer} /> : <div />} 75 73 {finished_init.value 76 - ? <ul class="messages" ref={list_elem} onScroll={e => { 77 - const elem = e.currentTarget; 78 - const padding = 5; 74 + ? <MessageList 75 + list_elem={list_elem} 76 + buffer={buffer} 77 + is_loading={is_loading} 78 + msgs={msgs} 79 + onScroll={e => { 80 + const elem = e.currentTarget; 81 + const padding = 5; 79 82 80 - is_scrolled.value = elem.scrollHeight > elem.scrollTop + elem.clientHeight + padding; 81 - }}> 82 - <StartOfHistory buffer={buffer} /> 83 - {is_loading.value && "loadin"} 84 - <LoadTrigger onIntersect={async () => { 85 - // if (is_loading.value == true) return; 86 - // is_loading.value = true; 87 - // const new_stuff = await load_msgs(buffer); 88 - // msgs.value = [...new_stuff, ...msgs.value]; 89 - }} parent={list_elem} /> 90 - {msgs.value.map(x => <Message msg={IrcMessage.hydrate(x)}></Message>)} 91 - </ul> 83 + marker.focused.value = elem.scrollHeight <= elem.scrollTop + elem.clientHeight + padding; 84 + }} 85 + /> 92 86 : <SkeletonLoader ref2={list_elem} /> 93 87 } 88 + {marker.unread_count.value != 0 && <UnreadBanner marker={marker} />} 94 89 <MessageInput 95 - is_scrolled={is_scrolled.value} 96 - onSubmit={(text, is_cmd) => { 90 + is_scrolled={!marker.focused.value} 91 + onSubmit={async (text, is_cmd) => { 97 92 if (is_cmd) { 98 - return execute_command(text, buffer); 93 + return await execute_command(text, buffer); 99 94 } 100 95 101 96 const msg = buffer.privmsg(text); ··· 107 102 </BufferContext.Provider>; 108 103 } 109 104 110 - const BufferContext = createContext<ChatBuffer | null>(null); 111 - 112 - const Message: FunctionalComponent<{ msg: IrcMessage }> = ({ msg }) => { 113 - const nick = msg.source?.nick; 114 - if (!nick) return <></>; 115 - 116 - const colour = pick_colour(nick.toString()); 117 - const style = ` 118 - --hover: var(--colour-${colour}-50); 119 - --selection: var(--colour-${colour}-700); 120 - `; 105 + export const MessageList 106 + : FunctionalComponent<{ 107 + list_elem: RefObject<HTMLUListElement>, 108 + buffer: ChatBuffer, 109 + is_loading: Signal<boolean>, 110 + msgs: Signal<IrcMessage[]>, 111 + onScroll: HTMLProps<HTMLUListElement>['onScroll'], 112 + }> 113 + = ({ list_elem, is_loading, onScroll, buffer, msgs }) => { 114 + const squished = squish_messages(buffer, msgs.value); 115 + return <ul class="messages" ref={list_elem} onScroll={onScroll}> 116 + {/* header. todo: should not be in a ul element */} 117 + <StartOfHistory buffer={buffer} /> 121 118 122 - if (msg.is_action) { 123 - return <li style={style}> 124 - <div class="left-bit"> 125 - <time datetime={msg.timestamp?.toDateString()} title={msg.timestamp?.toLocaleString()}> 126 - {msg.timestamp?.toLocaleTimeString(undefined, { timeStyle: "short" })} 127 - </time> 128 - <span class="name action">*</span> 129 - </div> 130 - <p><Nick nick={nick} colour={colour} /> {extract_content(msg)}</p> 131 - </li>; 132 - } 119 + {/* history getting bits */} 120 + {is_loading.value && "loadin"} 121 + {/* <LoadTrigger onIntersect={async () => {}} parent={list_elem} /> */} 133 122 134 - switch (msg.command) { 135 - case "PRIVMSG": return <li style={style}> 136 - <div class="left-bit"> 137 - <time datetime={msg.timestamp?.toDateString()} title={msg.timestamp?.toLocaleString()}> 138 - {msg.timestamp?.toLocaleTimeString(undefined, { timeStyle: "short" })} 139 - </time> 140 - <Nick nick={nick} colour={colour} /> 141 - </div> 142 - <p>{msg.content}</p> 143 - </li>; 144 - 145 - // default: return <li><span class="name">⚠️</span> <p>{msg.toString()}</p></li> 123 + {/* the messages themselves */} 124 + {squished} 125 + </ul>; 146 126 } 147 - return <></> 148 - } 149 127 150 - import { message_style } from "@src/support"; 151 - import GoneIcon from "~icons/ph/arrow-left"; 152 128 153 - const Nick 154 - : FunctionalComponent<{ colour?: string, nick: string }> 155 - = ({ colour, nick }) => { 156 - const buffer = useContext(BufferContext); 157 - const gone = useComputed(() => { 158 - return buffer instanceof IrcChannel 159 - && !buffer.$members.value.includes(nick) 160 - && nick != buffer.conn.nickname; 161 - }); 162 - 163 - return <> 164 - {gone.value && <GoneIcon width="12px" height="12px" />} 165 - 166 - <span 167 - class={` 168 - name 169 - ${gone.value ? "gone" : ""} 170 - ${nick.length > 10 ? "squish" : ""} 171 - `} 172 - style={`--colour: var(--colour-${colour}-700)`} 173 - title={nick} 174 - > 175 - {nick} 176 - </span> 177 - </> 178 - } 129 + const UnreadBanner 130 + : FunctionalComponent<{ marker: ReadMarker }> 131 + = ({ marker }) => <div class="unread-banner"> 132 + <span class="number">{marker.unread_count}</span> 133 + unread {marker.unread_count.value == 1 ? "message" : "messages"} 134 + </div> 179 135 180 136 const ChannelHeader 181 137 : FunctionalComponent<{ channel: IrcChannel }> ··· 187 143 {channel.$topic.value} 188 144 </p> 189 145 </header> 146 + 147 + const StartOfHistory: FunctionalComponent<{ buffer: ChatBuffer }> = ({ buffer }) => { 148 + const chathistory = buffer.conn.capabilities.has("draft/chathistory"); 149 + return <div className="message-list-start"> 150 + <b>{buffer.name}</b> 151 + <p class="subtitle">this is the start of the channel's logs.</p> 152 + {!chathistory && 153 + <p class="chathistory-warning"> 154 + <Trangle aria-hidden /> Messages sent while Tubes was closed might not be shown. 155 + <a href="/">Learn More</a> 156 + </p>} 157 + 158 + </div> 159 + } 190 160 191 161 const SkeletonLoader 192 162 : FunctionalComponent<{ ref2: RefObject<HTMLUListElement> }>
+4 -1
neo/src/chat/adapters.ts
··· 3 3 import { SojuAdapter } from "tubes_core/soju/adapter"; 4 4 import { store_message } from "@src/storage"; 5 5 import History from "tubes_core/history"; 6 + import tubes_handler from "./handler"; 6 7 7 8 export const adapters = signal<Adapter[]>([]); 8 9 9 10 export const add_adapter = () => { 10 11 const adapter = new SojuAdapter({ 12 + id: "yeah", 11 13 }, { 12 14 history_fetcher: History.chathistory, 15 + handler: tubes_handler, 13 16 on_connect(conn) { 14 17 conn.queue.subscribe("tubes storage", (msg) => store_message(conn, msg)); 15 18 }, ··· 17 20 18 21 adapters.value = [...adapters.value, adapter]; 19 22 adapter.activate(); 20 - } 23 + }
+15 -4
neo/src/chat/commands.ts
··· 1 1 import { store_message } from "@src/storage"; 2 - import { ChatBuffer } from "tubes_core/channel"; 2 + import { ChatBuffer, IrcChannel } from "tubes_core/channel"; 3 3 4 4 export interface TubesCommand { 5 5 description: string, 6 - activate: (params: string, buffer: ChatBuffer) => void, 6 + activate: (params: string, buffer: ChatBuffer) => Promise<void>, 7 7 } 8 8 9 9 export function execute_command(input: string, buffer: ChatBuffer) { ··· 21 21 throw new Error(`${cmd} is not a recognised command.`); 22 22 } 23 23 24 - cmd.activate(input, buffer); 24 + return cmd.activate(input, buffer); 25 25 } 26 26 27 27 const commands = <Record<string, TubesCommand>>{ 28 28 "me": { 29 29 description: "", 30 - activate: (text, buffer) => { 30 + activate: async (text, buffer) => { 31 31 const msg = buffer.privmsg(`\x01ACTION ${text}\x01`) 32 32 store_message(buffer.conn, msg); 33 33 }, 34 + }, 35 + "topic": { 36 + description: "Set the channel's topic", 37 + activate: async (text, buffer) => { 38 + console.log(buffer); 39 + if (!(buffer instanceof IrcChannel)) { 40 + throw new Error(`You can't set the topic on things that aren't channels.`); 41 + } 42 + 43 + await buffer.set_topic(text); 44 + } 34 45 } 35 46 }; 36 47
+8 -1
neo/src/chat/conns.ts
··· 7 7 import { ChatBuffer } from "tubes_core/channel"; 8 8 import { adapters } from "./adapters"; 9 9 import Config from "./config"; 10 + import tubes_handler from "./handler"; 10 11 11 12 const local_connections: Signal<Connection[]> = signal([]); 12 13 export const connections: Signal<Connection[]> = computed(() => [ ··· 30 31 function init_connection(config: ConnectionConfig): WsConnection { 31 32 const conn: WsConnection = new WsConnection(config, { 32 33 history_fetcher: tubes_history, 34 + handler: tubes_handler, 33 35 on_connect(conn) { 34 36 conn.queue.subscribe("tubes storage", (msg) => store_message(conn, msg)); 35 37 }, ··· 74 76 const idx = config["connections"].findIndex(x => x.id == conn.id); 75 77 if (idx == -1) return; 76 78 79 + if (config["connections"][idx].autojoin?.includes(name)) return; 80 + 77 81 config["connections"][idx].autojoin = [ 78 82 ...config["connections"][idx]?.autojoin ?? [], 79 83 name ··· 90 94 fetch: fetch_connection, 91 95 fetch_buffer, 92 96 add_autojoin, 93 - } 97 + } 98 + export const connection_base = (conn: Connection) => conn.adapter_id 99 + ? `/connection/${conn.adapter_id}/${conn.id}` 100 + : `/connection/${conn.id}`;
+19
neo/src/chat/handler.ts
··· 1 + import { default_handler, MessageHandler } from "tubes_core/handler"; 2 + import ReadMarkers from "./read"; 3 + 4 + const tubes_handler: MessageHandler = async (msg, conn) => { 5 + switch (msg.command) { 6 + case "PRIVMSG": { 7 + const target = msg.params?.[0]; 8 + if (!target) break; 9 + 10 + ReadMarkers.increment(target, conn); 11 + 12 + break; 13 + } 14 + } 15 + 16 + return default_handler(msg, conn); 17 + } 18 + 19 + export default tubes_handler;
neo/src/chat/presets.ts

This is a binary file and will not be displayed.

+60
neo/src/chat/read.ts
··· 1 + import { effect, signal, Signal } from "@preact/signals"; 2 + import { Connection } from "tubes_core"; 3 + import { IrcMessage } from "tubes_core/parser"; 4 + 5 + export type ReadMarker = { 6 + unread_count: Signal<number>, 7 + focused: Signal<boolean>, 8 + last_read: Signal<IrcMessage | undefined>, 9 + }; 10 + 11 + class ReadMarkers { 12 + read_markers = new Map<string, ReadMarker>(); 13 + 14 + #target_key(target: string, conn: Connection) { 15 + return conn.adapter_id 16 + ? `${conn.id}:${conn.adapter_id}:${target}` 17 + : `${conn.id}:${target}` 18 + } 19 + 20 + #init(target: string, conn: Connection) { 21 + const marker: ReadMarker = { 22 + unread_count: signal(0), 23 + focused: signal(false), 24 + last_read: signal(), 25 + } 26 + 27 + effect(() => { 28 + if (marker.focused.value) { 29 + marker.unread_count.value = 0; 30 + } 31 + }); 32 + 33 + this.read_markers.set(this.#target_key(target, conn), marker); 34 + 35 + return marker; 36 + } 37 + 38 + increment(target: string, conn: Connection) { 39 + let marker = this.get(target, conn); 40 + 41 + if (!marker.focused.value) { 42 + marker.unread_count.value = marker.unread_count.value + 1; 43 + } 44 + } 45 + 46 + get(target: string, conn: Connection) { 47 + const marker = this.read_markers.get(this.#target_key(target, conn)); 48 + if (!marker) return this.#init(target, conn); 49 + 50 + return marker; 51 + } 52 + 53 + reset(target: string, conn: Connection) { 54 + let marker = this.get(target, conn); 55 + 56 + marker.unread_count.value = 0; 57 + } 58 + } 59 + 60 + export default new ReadMarkers();
+42 -35
neo/src/css/connection-info.css
··· 1 - dialog.connection-info { 1 + .conn-info { 2 2 display: grid; 3 - grid-template-columns: 1fr 1fr; 4 - grid-auto-rows: max-content; 3 + grid-template-columns: 16rem 1fr; 5 4 6 - hgroup { 7 - height: 8rem; 8 - --width: 48rem; 9 - grid-column: 1 / -1; 10 - padding: 1.25rem calc((100% - var(--width)) / 2); 11 - 5 + height: max(24rem, 80vh); 6 + 7 + aside.sidebar { 12 8 display: flex; 13 9 flex-direction: column; 14 - justify-content: end; 15 - gap: .25rem; 16 - 17 - p { 18 - font-size: .9rem; 19 - font-variation-settings: 'GRAD' 100; 20 - font-style: italic; 21 - color: var(--colour-grey-800); 22 - 10 + border-right: 1px solid var(--colour-grey-100); 11 + padding: .75rem .25rem; 12 + 13 + ul { 14 + list-style: none; 15 + padding: 0; 23 16 margin: 0; 17 + 18 + display: flex; 19 + flex-direction: column; 20 + gap: .15rem; 24 21 } 25 - } 26 - 27 - h1 { 28 - grid-column: 1 / -1; 29 - font-size: 1.5rem; 30 - font-weight: 500; 31 - /* font-style: italic; */ 32 - word-break: break-all; 33 - 34 - width: max-content; 35 - margin: 0; 22 + 23 + hgroup { 24 + padding: .75rem; 25 + 26 + p { 27 + margin: 0; 28 + font-size: .8rem; 29 + font-style: italic; 30 + color: var(--colour-grey-700); 31 + user-select: none; 32 + } 36 33 37 - color: var(--colour-grey-950); 34 + h1 { 35 + margin: 0; 36 + margin-top: .5rem; 37 + font-size: .9rem; 38 + font-weight: 500; 39 + } 40 + } 38 41 } 42 + } 39 43 40 - .sep { 41 - grid-column: 1 / -1; 42 - color: var(--colour-grey-200); 43 - border: none; 44 - border-top: 1px solid currentColor; 44 + .conn-info .about-page { 45 + padding: .75rem; 46 + position: relative; 47 + overflow-x: hidden; 48 + 49 + h1 { 50 + color: var(--colour-grey-700); 51 + margin-top: 0; 45 52 } 46 53 }
+1 -1
neo/src/css/dialog.css
··· 5 5 border-radius: 6px; 6 6 box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 7 7 padding: .75rem; 8 - width: 36rem; 8 + max-width: auto; 9 9 10 10 &::backdrop { 11 11 display: none;
+31
neo/src/css/join-channel.css
··· 1 + .join-channel { 2 + display: grid; 3 + grid-auto-rows: max-content; 4 + 5 + section { 6 + --max-width: 36rem; 7 + padding: 2rem calc((100% - var(--max-width)) / 2); 8 + } 9 + 10 + section:first-of-type { 11 + border-bottom: 1px solid var(--colour-grey-100); 12 + } 13 + 14 + h2 { 15 + font-size: 1.25rem; 16 + font-weight: 400; 17 + margin-top: 1.5rem; 18 + margin-bottom: 0; 19 + } 20 + 21 + p, form { 22 + margin-top: 0.5rem; 23 + } 24 + 25 + form { 26 + display: flex; 27 + flex-direction: column; 28 + margin: 0 auto; 29 + margin-top: 2rem; 30 + } 31 + }
+175 -4
neo/src/css/messages.css
··· 17 17 18 18 display: grid; 19 19 grid-template-columns: subgrid; 20 - grid-template-rows: 1fr ; 20 + grid-template-rows: 1fr; 21 21 grid-auto-rows: max-content; 22 22 font-size: .9rem; 23 23 ··· 55 55 } 56 56 57 57 span.name { 58 - display: block; 58 + display: inline; 59 59 align-items: baseline; 60 60 gap: .25rem; 61 61 justify-self: end; ··· 86 86 87 87 span.action { 88 88 display: block; 89 + overflow: visible; 89 90 line-height: 0; 90 - height: 0rem; 91 + height: 0; 91 92 margin-top: .6rem; 92 93 align-self: center; 93 94 font-size: 2rem; ··· 99 100 span.name.gone { 100 101 font-variation-settings: 'GRAD' 0; 101 102 font-weight: 400; 102 - filter: saturate(50%); 103 + color: color-mix(in srgb, var(--colour) 40%, var(--colour-grey-700)); 103 104 104 105 > svg { 105 106 align-self: center; 106 107 color: var(--colour-grey-700); 107 108 } 109 + 110 + li:hover & { 111 + color: var(--colour); 112 + } 108 113 } 109 114 110 115 time { ··· 136 141 border-radius: 4px; 137 142 display: flex; 138 143 flex-direction: column; 144 + 145 + .left-bit { 146 + flex-direction: row-reverse; 147 + gap: .5rem; 148 + } 139 149 } 140 150 } 141 151 } ··· 173 183 } 174 184 175 185 .input { 186 + position: relative; 176 187 grid-column: 2 / -2; 177 188 background-color: var(--bg); 178 189 border: var(--border); ··· 180 191 border-right: none; 181 192 } 182 193 194 + .command-ghost { 195 + position: absolute; 196 + top: 0; 197 + bottom: 0; 198 + height: max-content; 199 + margin: auto; 200 + 201 + display: flex; 202 + align-items: center; 203 + font-size: .85rem; 204 + padding: .25rem .2rem; 205 + background-color: var(--colour-accent-200); 206 + border-radius: 4px; 207 + z-index: 0; 208 + color: transparent; 209 + 210 + user-select: none; 211 + pointer-events: none; 212 + } 213 + 183 214 input { 215 + position: relative; 216 + z-index: 1; 184 217 height: 100%; 185 218 width: 100%; 186 219 ··· 287 320 margin: auto; 288 321 } 289 322 } 323 + } 290 324 325 + .input-error { 326 + grid-column: 1 / -1; 327 + display: grid; 328 + grid-template-columns: subgrid; 329 + margin: 0; 330 + align-items: center; 331 + 332 + background-color: var(--colour-red-100); 333 + 334 + font-variation-settings: 'GRAD' 100; 335 + font-size: .8rem; 336 + font-weight: 500; 337 + color: var(--colour-red-900); 338 + 339 + span { 340 + grid-column: 2 / -3; 341 + padding: .25rem 0; 342 + } 343 + 344 + svg { 345 + width: 10px; 346 + height: 10px; 347 + justify-self: end; 348 + } 349 + 350 + button { 351 + background-color: transparent; 352 + border: none; 353 + font: inherit; 354 + font-weight: 400; 355 + color: inherit; 356 + cursor: pointer; 357 + margin: 0 -1rem; 358 + padding: 0 1rem; 359 + height: 100%; 360 + width: max-content; 361 + justify-self: end; 362 + 363 + display: flex; 364 + gap: .25rem; 365 + align-items: center; 366 + 367 + svg { 368 + width: 12px; 369 + height: 12px; 370 + } 371 + 372 + &:hover { 373 + background-color: var(--colour-red-200); 374 + } 375 + 376 + } 291 377 } 292 378 293 379 .channel-header { ··· 372 458 background-color: var(--colour-grey-100); 373 459 color: transparent !important; 374 460 } 461 + } 462 + } 463 + 464 + .date-sep { 465 + margin: 0 .5rem; 466 + margin-right: 1rem; 467 + grid-column: 1 / -1; 468 + 469 + display: flex; 470 + align-items: center; 471 + gap: .5rem; 472 + 473 + white-space: nowrap; 474 + font-size: .75rem; 475 + font-variation-settings: 'GRAD' 100; 476 + color: var(--colour-grey-600); 477 + 478 + &::before { 479 + display: block; 480 + content: ''; 481 + height: 1px; 482 + width: 100%; 483 + background-color: var(--colour-grey-200); 484 + } 485 + } 486 + 487 + .unread-sep { 488 + margin: 0 .5rem; 489 + margin-right: 1rem; 490 + grid-column: 1 / -1; 491 + 492 + display: flex; 493 + align-items: center; 494 + gap: .25rem; 495 + 496 + span { 497 + background-color: var(--colour-accent-600); 498 + padding: .1rem .25rem; 499 + margin: -0.25rem 0; 500 + border-radius: 4px; 501 + 502 + color: var(--colour-accent-100); 503 + font-variation-settings: 'GRAD' 100; 504 + font-weight: 600; 505 + font-size: .75rem; 506 + font-style: italic; 507 + white-space: nowrap; 508 + } 509 + 510 + &::before { 511 + display: block; 512 + content: ''; 513 + height: 1px; 514 + width: 100%; 515 + background-color: var(--colour-accent-600); 516 + } 517 + } 518 + 519 + .unread-banner { 520 + grid-column: 1 / -1; 521 + display: grid; 522 + grid-template-columns: subgrid; 523 + 524 + background-color: var(--colour-accent-100); 525 + 526 + padding: .25rem; 527 + font-size: .8rem; 528 + font-weight: 500; 529 + color: var(--colour-grey-700); 530 + 531 + .number { 532 + display: block; 533 + height: 100%; 534 + min-width: 1rem; 535 + padding: 0 .15rem; 536 + display: flex; 537 + align-items: center; 538 + place-content: center; 539 + border-radius: 2px; 540 + 541 + justify-self: end; 542 + font-variation-settings: 'GRAD' 100; 543 + 544 + background-color: var(--colour-accent-600); 545 + color: white; 375 546 } 376 547 }
+57 -32
neo/src/css/sidebar.css
··· 140 140 display: flex; 141 141 flex-direction: column; 142 142 gap: .15rem; 143 + } 143 144 144 - > li.sidebar-item { 145 + li.sidebar-item { 146 + display: flex; 147 + flex: 1; 148 + 149 + &:not(:has(> button, a)), 150 + > button, 151 + > a { 145 152 display: flex; 146 153 flex: 1; 154 + gap: .25rem; 155 + align-items: center; 156 + justify-content: space-between; 147 157 148 - &:not(:has(> button, a)), 149 - > button, 150 - > a { 151 - display: flex; 152 - flex: 1; 153 - gap: .25rem; 154 - align-items: center; 155 - justify-content: space-between; 158 + height: 1.65rem; 159 + padding: 0 .5rem; 160 + margin: 0 .25rem; 161 + 162 + background-color: transparent; 163 + border: none; 164 + font: inherit; 165 + text-decoration: none; 166 + cursor: pointer; 167 + 168 + border-radius: 5px; 156 169 157 - height: 1.65rem; 158 - padding: 0 .5rem; 159 - margin: 0 .25rem; 170 + font-size: 0.825rem; 171 + color: var(--colour-grey-900); 172 + line-height: 1; 173 + 174 + &:hover { 175 + background-color: var(--colour-grey-100); 176 + } 177 + } 178 + 179 + &.selected:not(:has(> button, a)), 180 + &.selected > button, 181 + &.selected > a { 182 + background-color: var(--colour-accent-100); 183 + color: var(--colour-grey-950); 184 + font-variation-settings: 'GRAD' 100; 185 + } 186 + } 160 187 161 - background-color: transparent; 162 - border: none; 163 - font: inherit; 164 - text-decoration: none; 165 - cursor: pointer; 188 + .unread-marker { 189 + height: 1rem; 190 + min-width: 1rem; 191 + padding: .15rem; 192 + border-radius: 2px; 166 193 167 - border-radius: 5px; 194 + display: flex; 195 + align-items: center; 196 + justify-content: center; 168 197 169 - font-size: 0.825rem; 170 - color: var(--colour-grey-900); 171 - line-height: 1; 198 + font-variation-settings: 'GRAD' 100; 199 + font-weight: 500; 200 + 201 + background-color: var(--colour-grey-100); 172 202 173 - &:hover { 174 - background-color: var(--colour-grey-100); 175 - } 176 - } 203 + li.sidebar-item:hover & { 204 + background-color: var(--colour-grey-200); 205 + } 177 206 178 - &.selected:not(:has(> button, a)), 179 - &.selected > button, 180 - &.selected > a { 181 - background-color: var(--colour-accent-100); 182 - color: var(--colour-grey-950); 183 - font-variation-settings: 'GRAD' 100; 184 - } 207 + .selected & { 208 + background-color: var(--colour-accent-600); 209 + color: white; 185 210 } 186 211 } 187 212
+13 -3
neo/src/main.tsx
··· 8 8 import BufferView from "@src/buffer/view"; 9 9 import Connections from "@src/chat/conns"; 10 10 import DebugView from "@src/debug"; 11 + import SettingsPage from '@src/settings'; 12 + import { accent, build_accent_css } from '@src/support'; 11 13 import { render } from 'preact'; 12 14 import { Route, Router, Switch } from 'wouter-preact'; 13 15 import { useHashLocation } from "wouter-preact/use-hash-location"; 14 - import SettingsPage from './settings'; 15 - import { accent, build_accent_css } from './support'; 16 + import JoinChannelPage from './pages/join-channel'; 16 17 17 18 Connections.initialise(); 18 19 ··· 32 33 return conn ? <DebugView conn={conn} /> : "one sec"; 33 34 }} 34 35 </Route> 35 - <Route path="/connection/:adapter?/:id/:target"> 36 + <Route path="/connection/:adapter?/:id/channel/:target"> 36 37 {({ adapter, id, target }) => { 37 38 const conn = Connections.fetch(id, adapter); 38 39 const chan = conn?.get_channel(target); 39 40 return chan 40 41 ? <BufferView buffer={chan} /> 42 + : <p class="loader">(one sec)</p>; 43 + }} 44 + </Route> 45 + <Route path="/connection/:adapter?/:id/join"> 46 + {({ adapter, id }) => { 47 + const conn = Connections.fetch(id, adapter); 48 + 49 + return conn 50 + ? <JoinChannelPage conn={conn} /> 41 51 : <p class="loader">(one sec)</p>; 42 52 }} 43 53 </Route>
+64
neo/src/pages/join-channel.tsx
··· 1 + import "@css/join-channel.css"; 2 + import { useSignal } from "@preact/signals"; 3 + import { PrimaryButton } from "@src/bits/buttons"; 4 + import { ErrorMessage } from "@src/bits/errors"; 5 + import FormField from "@src/bits/form/form-field"; 6 + import { FunctionalComponent } from "preact" 7 + import { Connection } from "tubes_core" 8 + import Connections, { connection_base } from "@src/chat/conns"; 9 + import { useLocation } from "wouter-preact"; 10 + 11 + const JoinChannelPage: FunctionalComponent<{ conn: Connection }> = ({ conn }) => { 12 + const error = useSignal<string | undefined>(); 13 + const [, set_location] = useLocation(); 14 + 15 + return <article class="join-channel"> 16 + <section> 17 + <h2>Join a Channel</h2> 18 + <p class="body-small"> 19 + Conversations in Tubes happen in seperate channels. 20 + Channels tend to center around a specific topic or project 21 + they're associated with. 22 + </p> 23 + 24 + <form onSubmit={(e) => { 25 + error.value = undefined; 26 + e.preventDefault(); 27 + const data = new FormData(e.currentTarget); 28 + const channel = data.get("channel"); 29 + if (!channel || typeof channel != "string") { 30 + return; 31 + } 32 + 33 + try { 34 + conn.join_channel(channel); 35 + Connections.add_autojoin(channel, conn); 36 + set_location(`${connection_base(conn)}/channel/${channel}`) 37 + } catch (e) { 38 + if (e instanceof Error) { 39 + error.value = e.message; 40 + } 41 + } 42 + }}> 43 + <FormField 44 + label="Channel Name" 45 + flavour_text="the name of the channel you want to join. these usually start with a '#'" 46 + > 47 + <input required type="text" name="channel" placeholder="e.g., #tubes" /> 48 + </FormField> 49 + 50 + {error.value && <ErrorMessage>{error}</ErrorMessage>} 51 + 52 + <PrimaryButton style="margin-left: auto;">join</PrimaryButton> 53 + </form> 54 + </section> 55 + <section> 56 + <h2>Browse Channels</h2> 57 + <p class="body-small"> 58 + Get a big ol list of every channel on this network. 59 + </p> 60 + </section> 61 + </article> 62 + } 63 + 64 + export default JoinChannelPage;
+30 -8
neo/src/settings/index.tsx
··· 4 4 import { FunctionalComponent } from "preact"; 5 5 import { HTMLProps, TargetedEvent } from "preact/compat"; 6 6 import { useEffect, useRef } from "preact/hooks"; 7 + import Meta from "../../../meta.json"; 7 8 8 9 // helper component that fires an event when a radio button in a fieldset is selected 9 10 const FieldSetRadioButtonEventGroupThing ··· 51 52 52 53 <h2>bouncers</h2> 53 54 <div class="panel"> 54 - <p class="intro"> 55 - bouncers 55 + <p class="intro body-small"> 56 + a bouncer is an external service that keeps a record of message 57 + history while tubes is closed, among other things. 58 + <br /> 59 + depending on what networks you're connecting to and your 60 + personal value system this might or might not be desirable. 56 61 </p> 57 62 58 63 <div> ··· 133 138 </div> 134 139 <h2>networks</h2> 135 140 <div class="panel"> 136 - networks 141 + <p class="intro body-small">take a cold hard look at the networks you're connected to.</p> 137 142 </div> 138 143 <h2>notifications</h2> 139 144 <div class="panel"> 140 - notifications 145 + <p class="intro body-small">get a wide variety of dings and buzzes when things happen.</p> 141 146 </div> 142 147 <h2>accessibility</h2> 143 148 <div class="panel"> 144 - accessibility 149 + <p class="intro body-small">make tubes work a little bit better for you.</p> 150 + 145 151 </div> 146 - <h2>other</h2> 152 + <h2>bonus</h2> 147 153 <div class="panel"> 148 - other 154 + <p class="intro body-small">additional buttons for adventurous folk.</p> 149 155 </div> 150 156 <h2>about</h2> 151 157 <div class="panel"> 152 - about 158 + <article class="blurb body-small"> 159 + <b>Tubes {Meta.version}</b> 160 + <p> 161 + Tubes is developed in front of a live studio audience by&nbsp; 162 + <a href="https://leah.pronounmail.com" target="_blank"> 163 + Leah Clark 164 + </a>. 165 + </p> 166 + <p> 167 + Tubes is nice and&nbsp; 168 + <a href="https://codeberg.org/smethwick/tubes" target="_blank"> 169 + open source 170 + </a>, 171 + so please feel free to come along and contribute some code 172 + if you feel so inclined! 173 + </p> 174 + </article> 153 175 </div> 154 176 </article> 155 177 }
+3294
package-lock.json
··· 1 + { 2 + "name": "tubes", 3 + "version": "0.0.1", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "tubes", 9 + "version": "0.0.1", 10 + "workspaces": [ 11 + "neo", 12 + "core" 13 + ], 14 + "dependencies": { 15 + "@preact/signals": "1.3.0" 16 + } 17 + }, 18 + "core": { 19 + "name": "tubes_core", 20 + "version": "0.0.9", 21 + "license": "ISC", 22 + "dependencies": { 23 + "@preact/signals-core": "^1.8.0", 24 + "async-mutex": "^0.5.0", 25 + "isomorphic-ws": "^5.0.0", 26 + "nanoid": "^5.0.7", 27 + "ws": "^8.18.0" 28 + }, 29 + "devDependencies": { 30 + "@types/ws": "^8.5.12", 31 + "happy-dom": "14.12.3", 32 + "typescript": "^5.5.4", 33 + "vite": "^5.3.5", 34 + "vitest": "^2.0.4" 35 + } 36 + }, 37 + "neo": { 38 + "name": "neotubes", 39 + "version": "0.0.0", 40 + "dependencies": { 41 + "@fontsource-variable/roboto-serif": "^5.0.14", 42 + "@preact/signals": "^1.3.0", 43 + "async-mutex": "^0.5.0", 44 + "dayjs": "^1.11.13", 45 + "dexie": "^4.0.8", 46 + "motion": "^10.18.0", 47 + "preact": "^10.23.1", 48 + "wouter-preact": "^3.3.1" 49 + }, 50 + "devDependencies": { 51 + "@iconify-json/ph": "^1.1.13", 52 + "@preact/preset-vite": "^2.9.0", 53 + "@svgr/core": "^8.1.0", 54 + "@svgr/plugin-jsx": "^8.1.0", 55 + "@types/node": "^20.14.13", 56 + "typescript": "^5.5.4", 57 + "unplugin-icons": "^0.19.1", 58 + "vite": "^5.3.5" 59 + } 60 + }, 61 + "node_modules/@ampproject/remapping": { 62 + "version": "2.3.0", 63 + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 64 + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 65 + "dev": true, 66 + "dependencies": { 67 + "@jridgewell/gen-mapping": "^0.3.5", 68 + "@jridgewell/trace-mapping": "^0.3.24" 69 + }, 70 + "engines": { 71 + "node": ">=6.0.0" 72 + } 73 + }, 74 + "node_modules/@antfu/install-pkg": { 75 + "version": "0.4.1", 76 + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", 77 + "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", 78 + "dev": true, 79 + "dependencies": { 80 + "package-manager-detector": "^0.2.0", 81 + "tinyexec": "^0.3.0" 82 + }, 83 + "funding": { 84 + "url": "https://github.com/sponsors/antfu" 85 + } 86 + }, 87 + "node_modules/@antfu/utils": { 88 + "version": "0.7.10", 89 + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", 90 + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", 91 + "dev": true, 92 + "funding": { 93 + "url": "https://github.com/sponsors/antfu" 94 + } 95 + }, 96 + "node_modules/@babel/code-frame": { 97 + "version": "7.24.7", 98 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", 99 + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", 100 + "dev": true, 101 + "dependencies": { 102 + "@babel/highlight": "^7.24.7", 103 + "picocolors": "^1.0.0" 104 + }, 105 + "engines": { 106 + "node": ">=6.9.0" 107 + } 108 + }, 109 + "node_modules/@babel/compat-data": { 110 + "version": "7.25.4", 111 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", 112 + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", 113 + "dev": true, 114 + "engines": { 115 + "node": ">=6.9.0" 116 + } 117 + }, 118 + "node_modules/@babel/core": { 119 + "version": "7.25.2", 120 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", 121 + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", 122 + "dev": true, 123 + "dependencies": { 124 + "@ampproject/remapping": "^2.2.0", 125 + "@babel/code-frame": "^7.24.7", 126 + "@babel/generator": "^7.25.0", 127 + "@babel/helper-compilation-targets": "^7.25.2", 128 + "@babel/helper-module-transforms": "^7.25.2", 129 + "@babel/helpers": "^7.25.0", 130 + "@babel/parser": "^7.25.0", 131 + "@babel/template": "^7.25.0", 132 + "@babel/traverse": "^7.25.2", 133 + "@babel/types": "^7.25.2", 134 + "convert-source-map": "^2.0.0", 135 + "debug": "^4.1.0", 136 + "gensync": "^1.0.0-beta.2", 137 + "json5": "^2.2.3", 138 + "semver": "^6.3.1" 139 + }, 140 + "engines": { 141 + "node": ">=6.9.0" 142 + }, 143 + "funding": { 144 + "type": "opencollective", 145 + "url": "https://opencollective.com/babel" 146 + } 147 + }, 148 + "node_modules/@babel/generator": { 149 + "version": "7.25.6", 150 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", 151 + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", 152 + "dev": true, 153 + "dependencies": { 154 + "@babel/types": "^7.25.6", 155 + "@jridgewell/gen-mapping": "^0.3.5", 156 + "@jridgewell/trace-mapping": "^0.3.25", 157 + "jsesc": "^2.5.1" 158 + }, 159 + "engines": { 160 + "node": ">=6.9.0" 161 + } 162 + }, 163 + "node_modules/@babel/helper-annotate-as-pure": { 164 + "version": "7.24.7", 165 + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", 166 + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", 167 + "dev": true, 168 + "dependencies": { 169 + "@babel/types": "^7.24.7" 170 + }, 171 + "engines": { 172 + "node": ">=6.9.0" 173 + } 174 + }, 175 + "node_modules/@babel/helper-compilation-targets": { 176 + "version": "7.25.2", 177 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", 178 + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", 179 + "dev": true, 180 + "dependencies": { 181 + "@babel/compat-data": "^7.25.2", 182 + "@babel/helper-validator-option": "^7.24.8", 183 + "browserslist": "^4.23.1", 184 + "lru-cache": "^5.1.1", 185 + "semver": "^6.3.1" 186 + }, 187 + "engines": { 188 + "node": ">=6.9.0" 189 + } 190 + }, 191 + "node_modules/@babel/helper-module-imports": { 192 + "version": "7.24.7", 193 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", 194 + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", 195 + "dev": true, 196 + "dependencies": { 197 + "@babel/traverse": "^7.24.7", 198 + "@babel/types": "^7.24.7" 199 + }, 200 + "engines": { 201 + "node": ">=6.9.0" 202 + } 203 + }, 204 + "node_modules/@babel/helper-module-transforms": { 205 + "version": "7.25.2", 206 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", 207 + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", 208 + "dev": true, 209 + "dependencies": { 210 + "@babel/helper-module-imports": "^7.24.7", 211 + "@babel/helper-simple-access": "^7.24.7", 212 + "@babel/helper-validator-identifier": "^7.24.7", 213 + "@babel/traverse": "^7.25.2" 214 + }, 215 + "engines": { 216 + "node": ">=6.9.0" 217 + }, 218 + "peerDependencies": { 219 + "@babel/core": "^7.0.0" 220 + } 221 + }, 222 + "node_modules/@babel/helper-plugin-utils": { 223 + "version": "7.24.8", 224 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", 225 + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", 226 + "dev": true, 227 + "engines": { 228 + "node": ">=6.9.0" 229 + } 230 + }, 231 + "node_modules/@babel/helper-simple-access": { 232 + "version": "7.24.7", 233 + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", 234 + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", 235 + "dev": true, 236 + "dependencies": { 237 + "@babel/traverse": "^7.24.7", 238 + "@babel/types": "^7.24.7" 239 + }, 240 + "engines": { 241 + "node": ">=6.9.0" 242 + } 243 + }, 244 + "node_modules/@babel/helper-string-parser": { 245 + "version": "7.24.8", 246 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", 247 + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", 248 + "dev": true, 249 + "engines": { 250 + "node": ">=6.9.0" 251 + } 252 + }, 253 + "node_modules/@babel/helper-validator-identifier": { 254 + "version": "7.24.7", 255 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", 256 + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", 257 + "dev": true, 258 + "engines": { 259 + "node": ">=6.9.0" 260 + } 261 + }, 262 + "node_modules/@babel/helper-validator-option": { 263 + "version": "7.24.8", 264 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", 265 + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", 266 + "dev": true, 267 + "engines": { 268 + "node": ">=6.9.0" 269 + } 270 + }, 271 + "node_modules/@babel/helpers": { 272 + "version": "7.25.6", 273 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", 274 + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", 275 + "dev": true, 276 + "dependencies": { 277 + "@babel/template": "^7.25.0", 278 + "@babel/types": "^7.25.6" 279 + }, 280 + "engines": { 281 + "node": ">=6.9.0" 282 + } 283 + }, 284 + "node_modules/@babel/highlight": { 285 + "version": "7.24.7", 286 + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", 287 + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", 288 + "dev": true, 289 + "dependencies": { 290 + "@babel/helper-validator-identifier": "^7.24.7", 291 + "chalk": "^2.4.2", 292 + "js-tokens": "^4.0.0", 293 + "picocolors": "^1.0.0" 294 + }, 295 + "engines": { 296 + "node": ">=6.9.0" 297 + } 298 + }, 299 + "node_modules/@babel/parser": { 300 + "version": "7.25.6", 301 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", 302 + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", 303 + "dev": true, 304 + "dependencies": { 305 + "@babel/types": "^7.25.6" 306 + }, 307 + "bin": { 308 + "parser": "bin/babel-parser.js" 309 + }, 310 + "engines": { 311 + "node": ">=6.0.0" 312 + } 313 + }, 314 + "node_modules/@babel/plugin-syntax-jsx": { 315 + "version": "7.24.7", 316 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", 317 + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", 318 + "dev": true, 319 + "dependencies": { 320 + "@babel/helper-plugin-utils": "^7.24.7" 321 + }, 322 + "engines": { 323 + "node": ">=6.9.0" 324 + }, 325 + "peerDependencies": { 326 + "@babel/core": "^7.0.0-0" 327 + } 328 + }, 329 + "node_modules/@babel/plugin-transform-react-jsx": { 330 + "version": "7.25.2", 331 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", 332 + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", 333 + "dev": true, 334 + "dependencies": { 335 + "@babel/helper-annotate-as-pure": "^7.24.7", 336 + "@babel/helper-module-imports": "^7.24.7", 337 + "@babel/helper-plugin-utils": "^7.24.8", 338 + "@babel/plugin-syntax-jsx": "^7.24.7", 339 + "@babel/types": "^7.25.2" 340 + }, 341 + "engines": { 342 + "node": ">=6.9.0" 343 + }, 344 + "peerDependencies": { 345 + "@babel/core": "^7.0.0-0" 346 + } 347 + }, 348 + "node_modules/@babel/plugin-transform-react-jsx-development": { 349 + "version": "7.24.7", 350 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", 351 + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", 352 + "dev": true, 353 + "dependencies": { 354 + "@babel/plugin-transform-react-jsx": "^7.24.7" 355 + }, 356 + "engines": { 357 + "node": ">=6.9.0" 358 + }, 359 + "peerDependencies": { 360 + "@babel/core": "^7.0.0-0" 361 + } 362 + }, 363 + "node_modules/@babel/template": { 364 + "version": "7.25.0", 365 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", 366 + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", 367 + "dev": true, 368 + "dependencies": { 369 + "@babel/code-frame": "^7.24.7", 370 + "@babel/parser": "^7.25.0", 371 + "@babel/types": "^7.25.0" 372 + }, 373 + "engines": { 374 + "node": ">=6.9.0" 375 + } 376 + }, 377 + "node_modules/@babel/traverse": { 378 + "version": "7.25.6", 379 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", 380 + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", 381 + "dev": true, 382 + "dependencies": { 383 + "@babel/code-frame": "^7.24.7", 384 + "@babel/generator": "^7.25.6", 385 + "@babel/parser": "^7.25.6", 386 + "@babel/template": "^7.25.0", 387 + "@babel/types": "^7.25.6", 388 + "debug": "^4.3.1", 389 + "globals": "^11.1.0" 390 + }, 391 + "engines": { 392 + "node": ">=6.9.0" 393 + } 394 + }, 395 + "node_modules/@babel/types": { 396 + "version": "7.25.6", 397 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", 398 + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", 399 + "dev": true, 400 + "dependencies": { 401 + "@babel/helper-string-parser": "^7.24.8", 402 + "@babel/helper-validator-identifier": "^7.24.7", 403 + "to-fast-properties": "^2.0.0" 404 + }, 405 + "engines": { 406 + "node": ">=6.9.0" 407 + } 408 + }, 409 + "node_modules/@esbuild/aix-ppc64": { 410 + "version": "0.21.5", 411 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", 412 + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", 413 + "cpu": [ 414 + "ppc64" 415 + ], 416 + "dev": true, 417 + "optional": true, 418 + "os": [ 419 + "aix" 420 + ], 421 + "engines": { 422 + "node": ">=12" 423 + } 424 + }, 425 + "node_modules/@esbuild/android-arm": { 426 + "version": "0.21.5", 427 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", 428 + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", 429 + "cpu": [ 430 + "arm" 431 + ], 432 + "dev": true, 433 + "optional": true, 434 + "os": [ 435 + "android" 436 + ], 437 + "engines": { 438 + "node": ">=12" 439 + } 440 + }, 441 + "node_modules/@esbuild/android-arm64": { 442 + "version": "0.21.5", 443 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", 444 + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", 445 + "cpu": [ 446 + "arm64" 447 + ], 448 + "dev": true, 449 + "optional": true, 450 + "os": [ 451 + "android" 452 + ], 453 + "engines": { 454 + "node": ">=12" 455 + } 456 + }, 457 + "node_modules/@esbuild/android-x64": { 458 + "version": "0.21.5", 459 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", 460 + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", 461 + "cpu": [ 462 + "x64" 463 + ], 464 + "dev": true, 465 + "optional": true, 466 + "os": [ 467 + "android" 468 + ], 469 + "engines": { 470 + "node": ">=12" 471 + } 472 + }, 473 + "node_modules/@esbuild/darwin-arm64": { 474 + "version": "0.21.5", 475 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", 476 + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", 477 + "cpu": [ 478 + "arm64" 479 + ], 480 + "dev": true, 481 + "optional": true, 482 + "os": [ 483 + "darwin" 484 + ], 485 + "engines": { 486 + "node": ">=12" 487 + } 488 + }, 489 + "node_modules/@esbuild/darwin-x64": { 490 + "version": "0.21.5", 491 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", 492 + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", 493 + "cpu": [ 494 + "x64" 495 + ], 496 + "dev": true, 497 + "optional": true, 498 + "os": [ 499 + "darwin" 500 + ], 501 + "engines": { 502 + "node": ">=12" 503 + } 504 + }, 505 + "node_modules/@esbuild/freebsd-arm64": { 506 + "version": "0.21.5", 507 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", 508 + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", 509 + "cpu": [ 510 + "arm64" 511 + ], 512 + "dev": true, 513 + "optional": true, 514 + "os": [ 515 + "freebsd" 516 + ], 517 + "engines": { 518 + "node": ">=12" 519 + } 520 + }, 521 + "node_modules/@esbuild/freebsd-x64": { 522 + "version": "0.21.5", 523 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", 524 + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", 525 + "cpu": [ 526 + "x64" 527 + ], 528 + "dev": true, 529 + "optional": true, 530 + "os": [ 531 + "freebsd" 532 + ], 533 + "engines": { 534 + "node": ">=12" 535 + } 536 + }, 537 + "node_modules/@esbuild/linux-arm": { 538 + "version": "0.21.5", 539 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", 540 + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", 541 + "cpu": [ 542 + "arm" 543 + ], 544 + "dev": true, 545 + "optional": true, 546 + "os": [ 547 + "linux" 548 + ], 549 + "engines": { 550 + "node": ">=12" 551 + } 552 + }, 553 + "node_modules/@esbuild/linux-arm64": { 554 + "version": "0.21.5", 555 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", 556 + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", 557 + "cpu": [ 558 + "arm64" 559 + ], 560 + "dev": true, 561 + "optional": true, 562 + "os": [ 563 + "linux" 564 + ], 565 + "engines": { 566 + "node": ">=12" 567 + } 568 + }, 569 + "node_modules/@esbuild/linux-ia32": { 570 + "version": "0.21.5", 571 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", 572 + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", 573 + "cpu": [ 574 + "ia32" 575 + ], 576 + "dev": true, 577 + "optional": true, 578 + "os": [ 579 + "linux" 580 + ], 581 + "engines": { 582 + "node": ">=12" 583 + } 584 + }, 585 + "node_modules/@esbuild/linux-loong64": { 586 + "version": "0.21.5", 587 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", 588 + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", 589 + "cpu": [ 590 + "loong64" 591 + ], 592 + "dev": true, 593 + "optional": true, 594 + "os": [ 595 + "linux" 596 + ], 597 + "engines": { 598 + "node": ">=12" 599 + } 600 + }, 601 + "node_modules/@esbuild/linux-mips64el": { 602 + "version": "0.21.5", 603 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", 604 + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", 605 + "cpu": [ 606 + "mips64el" 607 + ], 608 + "dev": true, 609 + "optional": true, 610 + "os": [ 611 + "linux" 612 + ], 613 + "engines": { 614 + "node": ">=12" 615 + } 616 + }, 617 + "node_modules/@esbuild/linux-ppc64": { 618 + "version": "0.21.5", 619 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", 620 + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", 621 + "cpu": [ 622 + "ppc64" 623 + ], 624 + "dev": true, 625 + "optional": true, 626 + "os": [ 627 + "linux" 628 + ], 629 + "engines": { 630 + "node": ">=12" 631 + } 632 + }, 633 + "node_modules/@esbuild/linux-riscv64": { 634 + "version": "0.21.5", 635 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", 636 + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", 637 + "cpu": [ 638 + "riscv64" 639 + ], 640 + "dev": true, 641 + "optional": true, 642 + "os": [ 643 + "linux" 644 + ], 645 + "engines": { 646 + "node": ">=12" 647 + } 648 + }, 649 + "node_modules/@esbuild/linux-s390x": { 650 + "version": "0.21.5", 651 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", 652 + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", 653 + "cpu": [ 654 + "s390x" 655 + ], 656 + "dev": true, 657 + "optional": true, 658 + "os": [ 659 + "linux" 660 + ], 661 + "engines": { 662 + "node": ">=12" 663 + } 664 + }, 665 + "node_modules/@esbuild/linux-x64": { 666 + "version": "0.21.5", 667 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", 668 + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", 669 + "cpu": [ 670 + "x64" 671 + ], 672 + "dev": true, 673 + "optional": true, 674 + "os": [ 675 + "linux" 676 + ], 677 + "engines": { 678 + "node": ">=12" 679 + } 680 + }, 681 + "node_modules/@esbuild/netbsd-x64": { 682 + "version": "0.21.5", 683 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", 684 + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", 685 + "cpu": [ 686 + "x64" 687 + ], 688 + "dev": true, 689 + "optional": true, 690 + "os": [ 691 + "netbsd" 692 + ], 693 + "engines": { 694 + "node": ">=12" 695 + } 696 + }, 697 + "node_modules/@esbuild/openbsd-x64": { 698 + "version": "0.21.5", 699 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", 700 + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", 701 + "cpu": [ 702 + "x64" 703 + ], 704 + "dev": true, 705 + "optional": true, 706 + "os": [ 707 + "openbsd" 708 + ], 709 + "engines": { 710 + "node": ">=12" 711 + } 712 + }, 713 + "node_modules/@esbuild/sunos-x64": { 714 + "version": "0.21.5", 715 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", 716 + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", 717 + "cpu": [ 718 + "x64" 719 + ], 720 + "dev": true, 721 + "optional": true, 722 + "os": [ 723 + "sunos" 724 + ], 725 + "engines": { 726 + "node": ">=12" 727 + } 728 + }, 729 + "node_modules/@esbuild/win32-arm64": { 730 + "version": "0.21.5", 731 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", 732 + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", 733 + "cpu": [ 734 + "arm64" 735 + ], 736 + "dev": true, 737 + "optional": true, 738 + "os": [ 739 + "win32" 740 + ], 741 + "engines": { 742 + "node": ">=12" 743 + } 744 + }, 745 + "node_modules/@esbuild/win32-ia32": { 746 + "version": "0.21.5", 747 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", 748 + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", 749 + "cpu": [ 750 + "ia32" 751 + ], 752 + "dev": true, 753 + "optional": true, 754 + "os": [ 755 + "win32" 756 + ], 757 + "engines": { 758 + "node": ">=12" 759 + } 760 + }, 761 + "node_modules/@esbuild/win32-x64": { 762 + "version": "0.21.5", 763 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", 764 + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", 765 + "cpu": [ 766 + "x64" 767 + ], 768 + "dev": true, 769 + "optional": true, 770 + "os": [ 771 + "win32" 772 + ], 773 + "engines": { 774 + "node": ">=12" 775 + } 776 + }, 777 + "node_modules/@fontsource-variable/roboto-serif": { 778 + "version": "5.0.15", 779 + "resolved": "https://registry.npmjs.org/@fontsource-variable/roboto-serif/-/roboto-serif-5.0.15.tgz", 780 + "integrity": "sha512-TXCktF3EYdoXzKzD44Blo/CjzdRhyToPUjF9zA+WesT3t1ZnyHNc0roI2qJH8EGb4bdTfxiICxCzwD6njkpBZQ==" 781 + }, 782 + "node_modules/@iconify-json/ph": { 783 + "version": "1.2.0", 784 + "resolved": "https://registry.npmjs.org/@iconify-json/ph/-/ph-1.2.0.tgz", 785 + "integrity": "sha512-013eLpgTmX1lACOuDnkuhC7gRHyYj9w/j8SyDmlyUYvsKQrwdRsv1otcXtwH3DevuDAzSkreeeRsCeez+gTyVA==", 786 + "dev": true, 787 + "dependencies": { 788 + "@iconify/types": "*" 789 + } 790 + }, 791 + "node_modules/@iconify/types": { 792 + "version": "2.0.0", 793 + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", 794 + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", 795 + "dev": true 796 + }, 797 + "node_modules/@iconify/utils": { 798 + "version": "2.1.32", 799 + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.32.tgz", 800 + "integrity": "sha512-LeifFZPPKu28O3AEDpYJNdEbvS4/ojAPyIW+pF/vUpJTYnbTiXUHkCh0bwgFRzKvdpb8H4Fbfd/742++MF4fPQ==", 801 + "dev": true, 802 + "dependencies": { 803 + "@antfu/install-pkg": "^0.4.0", 804 + "@antfu/utils": "^0.7.10", 805 + "@iconify/types": "^2.0.0", 806 + "debug": "^4.3.6", 807 + "kolorist": "^1.8.0", 808 + "local-pkg": "^0.5.0", 809 + "mlly": "^1.7.1" 810 + } 811 + }, 812 + "node_modules/@jridgewell/gen-mapping": { 813 + "version": "0.3.5", 814 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 815 + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 816 + "dev": true, 817 + "dependencies": { 818 + "@jridgewell/set-array": "^1.2.1", 819 + "@jridgewell/sourcemap-codec": "^1.4.10", 820 + "@jridgewell/trace-mapping": "^0.3.24" 821 + }, 822 + "engines": { 823 + "node": ">=6.0.0" 824 + } 825 + }, 826 + "node_modules/@jridgewell/resolve-uri": { 827 + "version": "3.1.2", 828 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 829 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 830 + "dev": true, 831 + "engines": { 832 + "node": ">=6.0.0" 833 + } 834 + }, 835 + "node_modules/@jridgewell/set-array": { 836 + "version": "1.2.1", 837 + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 838 + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 839 + "dev": true, 840 + "engines": { 841 + "node": ">=6.0.0" 842 + } 843 + }, 844 + "node_modules/@jridgewell/sourcemap-codec": { 845 + "version": "1.5.0", 846 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 847 + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 848 + "dev": true 849 + }, 850 + "node_modules/@jridgewell/trace-mapping": { 851 + "version": "0.3.25", 852 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 853 + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 854 + "dev": true, 855 + "dependencies": { 856 + "@jridgewell/resolve-uri": "^3.1.0", 857 + "@jridgewell/sourcemap-codec": "^1.4.14" 858 + } 859 + }, 860 + "node_modules/@motionone/animation": { 861 + "version": "10.18.0", 862 + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", 863 + "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==", 864 + "dependencies": { 865 + "@motionone/easing": "^10.18.0", 866 + "@motionone/types": "^10.17.1", 867 + "@motionone/utils": "^10.18.0", 868 + "tslib": "^2.3.1" 869 + } 870 + }, 871 + "node_modules/@motionone/dom": { 872 + "version": "10.18.0", 873 + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", 874 + "integrity": "sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==", 875 + "dependencies": { 876 + "@motionone/animation": "^10.18.0", 877 + "@motionone/generators": "^10.18.0", 878 + "@motionone/types": "^10.17.1", 879 + "@motionone/utils": "^10.18.0", 880 + "hey-listen": "^1.0.8", 881 + "tslib": "^2.3.1" 882 + } 883 + }, 884 + "node_modules/@motionone/easing": { 885 + "version": "10.18.0", 886 + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", 887 + "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==", 888 + "dependencies": { 889 + "@motionone/utils": "^10.18.0", 890 + "tslib": "^2.3.1" 891 + } 892 + }, 893 + "node_modules/@motionone/generators": { 894 + "version": "10.18.0", 895 + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", 896 + "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==", 897 + "dependencies": { 898 + "@motionone/types": "^10.17.1", 899 + "@motionone/utils": "^10.18.0", 900 + "tslib": "^2.3.1" 901 + } 902 + }, 903 + "node_modules/@motionone/types": { 904 + "version": "10.17.1", 905 + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", 906 + "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==" 907 + }, 908 + "node_modules/@motionone/utils": { 909 + "version": "10.18.0", 910 + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz", 911 + "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==", 912 + "dependencies": { 913 + "@motionone/types": "^10.17.1", 914 + "hey-listen": "^1.0.8", 915 + "tslib": "^2.3.1" 916 + } 917 + }, 918 + "node_modules/@preact/preset-vite": { 919 + "version": "2.9.0", 920 + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.9.0.tgz", 921 + "integrity": "sha512-B9yVT7AkR6owrt84K3pLNyaKSvlioKdw65VqE/zMiR6HMovPekpsrwBNs5DJhBFEd5cvLMtCjHNHZ9P7Oblveg==", 922 + "dev": true, 923 + "dependencies": { 924 + "@babel/code-frame": "^7.22.13", 925 + "@babel/plugin-transform-react-jsx": "^7.22.15", 926 + "@babel/plugin-transform-react-jsx-development": "^7.22.5", 927 + "@prefresh/vite": "^2.4.1", 928 + "@rollup/pluginutils": "^4.1.1", 929 + "babel-plugin-transform-hook-names": "^1.0.2", 930 + "debug": "^4.3.4", 931 + "kolorist": "^1.8.0", 932 + "magic-string": "0.30.5", 933 + "node-html-parser": "^6.1.10", 934 + "resolve": "^1.22.8", 935 + "source-map": "^0.7.4", 936 + "stack-trace": "^1.0.0-pre2" 937 + }, 938 + "peerDependencies": { 939 + "@babel/core": "7.x", 940 + "vite": "2.x || 3.x || 4.x || 5.x" 941 + } 942 + }, 943 + "node_modules/@preact/signals": { 944 + "version": "1.3.0", 945 + "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-1.3.0.tgz", 946 + "integrity": "sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==", 947 + "dependencies": { 948 + "@preact/signals-core": "^1.7.0" 949 + }, 950 + "funding": { 951 + "type": "opencollective", 952 + "url": "https://opencollective.com/preact" 953 + }, 954 + "peerDependencies": { 955 + "preact": "10.x" 956 + } 957 + }, 958 + "node_modules/@preact/signals-core": { 959 + "version": "1.8.0", 960 + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.8.0.tgz", 961 + "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==", 962 + "funding": { 963 + "type": "opencollective", 964 + "url": "https://opencollective.com/preact" 965 + } 966 + }, 967 + "node_modules/@prefresh/babel-plugin": { 968 + "version": "0.5.1", 969 + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.1.tgz", 970 + "integrity": "sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==", 971 + "dev": true 972 + }, 973 + "node_modules/@prefresh/core": { 974 + "version": "1.5.2", 975 + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.2.tgz", 976 + "integrity": "sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==", 977 + "dev": true, 978 + "peerDependencies": { 979 + "preact": "^10.0.0" 980 + } 981 + }, 982 + "node_modules/@prefresh/utils": { 983 + "version": "1.2.0", 984 + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.0.tgz", 985 + "integrity": "sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==", 986 + "dev": true 987 + }, 988 + "node_modules/@prefresh/vite": { 989 + "version": "2.4.6", 990 + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.6.tgz", 991 + "integrity": "sha512-miYbTl2J1YNaQJWyWHJzyIpNh7vKUuXC1qCDRzPeWjhQ+9bxeXkUBGDGd9I1f37R5GQYi1S65AN5oR0BR2WzvQ==", 992 + "dev": true, 993 + "dependencies": { 994 + "@babel/core": "^7.22.1", 995 + "@prefresh/babel-plugin": "0.5.1", 996 + "@prefresh/core": "^1.5.1", 997 + "@prefresh/utils": "^1.2.0", 998 + "@rollup/pluginutils": "^4.2.1" 999 + }, 1000 + "peerDependencies": { 1001 + "preact": "^10.4.0", 1002 + "vite": ">=2.0.0" 1003 + } 1004 + }, 1005 + "node_modules/@rollup/pluginutils": { 1006 + "version": "4.2.1", 1007 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 1008 + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 1009 + "dev": true, 1010 + "dependencies": { 1011 + "estree-walker": "^2.0.1", 1012 + "picomatch": "^2.2.2" 1013 + }, 1014 + "engines": { 1015 + "node": ">= 8.0.0" 1016 + } 1017 + }, 1018 + "node_modules/@rollup/rollup-android-arm-eabi": { 1019 + "version": "4.21.2", 1020 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", 1021 + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", 1022 + "cpu": [ 1023 + "arm" 1024 + ], 1025 + "dev": true, 1026 + "optional": true, 1027 + "os": [ 1028 + "android" 1029 + ] 1030 + }, 1031 + "node_modules/@rollup/rollup-android-arm64": { 1032 + "version": "4.21.2", 1033 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", 1034 + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", 1035 + "cpu": [ 1036 + "arm64" 1037 + ], 1038 + "dev": true, 1039 + "optional": true, 1040 + "os": [ 1041 + "android" 1042 + ] 1043 + }, 1044 + "node_modules/@rollup/rollup-darwin-arm64": { 1045 + "version": "4.21.2", 1046 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", 1047 + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", 1048 + "cpu": [ 1049 + "arm64" 1050 + ], 1051 + "dev": true, 1052 + "optional": true, 1053 + "os": [ 1054 + "darwin" 1055 + ] 1056 + }, 1057 + "node_modules/@rollup/rollup-darwin-x64": { 1058 + "version": "4.21.2", 1059 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", 1060 + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", 1061 + "cpu": [ 1062 + "x64" 1063 + ], 1064 + "dev": true, 1065 + "optional": true, 1066 + "os": [ 1067 + "darwin" 1068 + ] 1069 + }, 1070 + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1071 + "version": "4.21.2", 1072 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", 1073 + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", 1074 + "cpu": [ 1075 + "arm" 1076 + ], 1077 + "dev": true, 1078 + "optional": true, 1079 + "os": [ 1080 + "linux" 1081 + ] 1082 + }, 1083 + "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1084 + "version": "4.21.2", 1085 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", 1086 + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", 1087 + "cpu": [ 1088 + "arm" 1089 + ], 1090 + "dev": true, 1091 + "optional": true, 1092 + "os": [ 1093 + "linux" 1094 + ] 1095 + }, 1096 + "node_modules/@rollup/rollup-linux-arm64-gnu": { 1097 + "version": "4.21.2", 1098 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", 1099 + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", 1100 + "cpu": [ 1101 + "arm64" 1102 + ], 1103 + "dev": true, 1104 + "optional": true, 1105 + "os": [ 1106 + "linux" 1107 + ] 1108 + }, 1109 + "node_modules/@rollup/rollup-linux-arm64-musl": { 1110 + "version": "4.21.2", 1111 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", 1112 + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", 1113 + "cpu": [ 1114 + "arm64" 1115 + ], 1116 + "dev": true, 1117 + "optional": true, 1118 + "os": [ 1119 + "linux" 1120 + ] 1121 + }, 1122 + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1123 + "version": "4.21.2", 1124 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", 1125 + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", 1126 + "cpu": [ 1127 + "ppc64" 1128 + ], 1129 + "dev": true, 1130 + "optional": true, 1131 + "os": [ 1132 + "linux" 1133 + ] 1134 + }, 1135 + "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1136 + "version": "4.21.2", 1137 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", 1138 + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", 1139 + "cpu": [ 1140 + "riscv64" 1141 + ], 1142 + "dev": true, 1143 + "optional": true, 1144 + "os": [ 1145 + "linux" 1146 + ] 1147 + }, 1148 + "node_modules/@rollup/rollup-linux-s390x-gnu": { 1149 + "version": "4.21.2", 1150 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", 1151 + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", 1152 + "cpu": [ 1153 + "s390x" 1154 + ], 1155 + "dev": true, 1156 + "optional": true, 1157 + "os": [ 1158 + "linux" 1159 + ] 1160 + }, 1161 + "node_modules/@rollup/rollup-linux-x64-gnu": { 1162 + "version": "4.21.2", 1163 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", 1164 + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", 1165 + "cpu": [ 1166 + "x64" 1167 + ], 1168 + "dev": true, 1169 + "optional": true, 1170 + "os": [ 1171 + "linux" 1172 + ] 1173 + }, 1174 + "node_modules/@rollup/rollup-linux-x64-musl": { 1175 + "version": "4.21.2", 1176 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", 1177 + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", 1178 + "cpu": [ 1179 + "x64" 1180 + ], 1181 + "dev": true, 1182 + "optional": true, 1183 + "os": [ 1184 + "linux" 1185 + ] 1186 + }, 1187 + "node_modules/@rollup/rollup-win32-arm64-msvc": { 1188 + "version": "4.21.2", 1189 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", 1190 + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", 1191 + "cpu": [ 1192 + "arm64" 1193 + ], 1194 + "dev": true, 1195 + "optional": true, 1196 + "os": [ 1197 + "win32" 1198 + ] 1199 + }, 1200 + "node_modules/@rollup/rollup-win32-ia32-msvc": { 1201 + "version": "4.21.2", 1202 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", 1203 + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", 1204 + "cpu": [ 1205 + "ia32" 1206 + ], 1207 + "dev": true, 1208 + "optional": true, 1209 + "os": [ 1210 + "win32" 1211 + ] 1212 + }, 1213 + "node_modules/@rollup/rollup-win32-x64-msvc": { 1214 + "version": "4.21.2", 1215 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", 1216 + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", 1217 + "cpu": [ 1218 + "x64" 1219 + ], 1220 + "dev": true, 1221 + "optional": true, 1222 + "os": [ 1223 + "win32" 1224 + ] 1225 + }, 1226 + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { 1227 + "version": "8.0.0", 1228 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", 1229 + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", 1230 + "dev": true, 1231 + "engines": { 1232 + "node": ">=14" 1233 + }, 1234 + "funding": { 1235 + "type": "github", 1236 + "url": "https://github.com/sponsors/gregberge" 1237 + }, 1238 + "peerDependencies": { 1239 + "@babel/core": "^7.0.0-0" 1240 + } 1241 + }, 1242 + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { 1243 + "version": "8.0.0", 1244 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", 1245 + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", 1246 + "dev": true, 1247 + "engines": { 1248 + "node": ">=14" 1249 + }, 1250 + "funding": { 1251 + "type": "github", 1252 + "url": "https://github.com/sponsors/gregberge" 1253 + }, 1254 + "peerDependencies": { 1255 + "@babel/core": "^7.0.0-0" 1256 + } 1257 + }, 1258 + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { 1259 + "version": "8.0.0", 1260 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", 1261 + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", 1262 + "dev": true, 1263 + "engines": { 1264 + "node": ">=14" 1265 + }, 1266 + "funding": { 1267 + "type": "github", 1268 + "url": "https://github.com/sponsors/gregberge" 1269 + }, 1270 + "peerDependencies": { 1271 + "@babel/core": "^7.0.0-0" 1272 + } 1273 + }, 1274 + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { 1275 + "version": "8.0.0", 1276 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", 1277 + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", 1278 + "dev": true, 1279 + "engines": { 1280 + "node": ">=14" 1281 + }, 1282 + "funding": { 1283 + "type": "github", 1284 + "url": "https://github.com/sponsors/gregberge" 1285 + }, 1286 + "peerDependencies": { 1287 + "@babel/core": "^7.0.0-0" 1288 + } 1289 + }, 1290 + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { 1291 + "version": "8.0.0", 1292 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", 1293 + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", 1294 + "dev": true, 1295 + "engines": { 1296 + "node": ">=14" 1297 + }, 1298 + "funding": { 1299 + "type": "github", 1300 + "url": "https://github.com/sponsors/gregberge" 1301 + }, 1302 + "peerDependencies": { 1303 + "@babel/core": "^7.0.0-0" 1304 + } 1305 + }, 1306 + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { 1307 + "version": "8.0.0", 1308 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", 1309 + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", 1310 + "dev": true, 1311 + "engines": { 1312 + "node": ">=14" 1313 + }, 1314 + "funding": { 1315 + "type": "github", 1316 + "url": "https://github.com/sponsors/gregberge" 1317 + }, 1318 + "peerDependencies": { 1319 + "@babel/core": "^7.0.0-0" 1320 + } 1321 + }, 1322 + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { 1323 + "version": "8.1.0", 1324 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", 1325 + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", 1326 + "dev": true, 1327 + "engines": { 1328 + "node": ">=14" 1329 + }, 1330 + "funding": { 1331 + "type": "github", 1332 + "url": "https://github.com/sponsors/gregberge" 1333 + }, 1334 + "peerDependencies": { 1335 + "@babel/core": "^7.0.0-0" 1336 + } 1337 + }, 1338 + "node_modules/@svgr/babel-plugin-transform-svg-component": { 1339 + "version": "8.0.0", 1340 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", 1341 + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", 1342 + "dev": true, 1343 + "engines": { 1344 + "node": ">=12" 1345 + }, 1346 + "funding": { 1347 + "type": "github", 1348 + "url": "https://github.com/sponsors/gregberge" 1349 + }, 1350 + "peerDependencies": { 1351 + "@babel/core": "^7.0.0-0" 1352 + } 1353 + }, 1354 + "node_modules/@svgr/babel-preset": { 1355 + "version": "8.1.0", 1356 + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", 1357 + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", 1358 + "dev": true, 1359 + "dependencies": { 1360 + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", 1361 + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", 1362 + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", 1363 + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", 1364 + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", 1365 + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", 1366 + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", 1367 + "@svgr/babel-plugin-transform-svg-component": "8.0.0" 1368 + }, 1369 + "engines": { 1370 + "node": ">=14" 1371 + }, 1372 + "funding": { 1373 + "type": "github", 1374 + "url": "https://github.com/sponsors/gregberge" 1375 + }, 1376 + "peerDependencies": { 1377 + "@babel/core": "^7.0.0-0" 1378 + } 1379 + }, 1380 + "node_modules/@svgr/core": { 1381 + "version": "8.1.0", 1382 + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", 1383 + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", 1384 + "dev": true, 1385 + "dependencies": { 1386 + "@babel/core": "^7.21.3", 1387 + "@svgr/babel-preset": "8.1.0", 1388 + "camelcase": "^6.2.0", 1389 + "cosmiconfig": "^8.1.3", 1390 + "snake-case": "^3.0.4" 1391 + }, 1392 + "engines": { 1393 + "node": ">=14" 1394 + }, 1395 + "funding": { 1396 + "type": "github", 1397 + "url": "https://github.com/sponsors/gregberge" 1398 + } 1399 + }, 1400 + "node_modules/@svgr/hast-util-to-babel-ast": { 1401 + "version": "8.0.0", 1402 + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", 1403 + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", 1404 + "dev": true, 1405 + "dependencies": { 1406 + "@babel/types": "^7.21.3", 1407 + "entities": "^4.4.0" 1408 + }, 1409 + "engines": { 1410 + "node": ">=14" 1411 + }, 1412 + "funding": { 1413 + "type": "github", 1414 + "url": "https://github.com/sponsors/gregberge" 1415 + } 1416 + }, 1417 + "node_modules/@svgr/plugin-jsx": { 1418 + "version": "8.1.0", 1419 + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", 1420 + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", 1421 + "dev": true, 1422 + "dependencies": { 1423 + "@babel/core": "^7.21.3", 1424 + "@svgr/babel-preset": "8.1.0", 1425 + "@svgr/hast-util-to-babel-ast": "8.0.0", 1426 + "svg-parser": "^2.0.4" 1427 + }, 1428 + "engines": { 1429 + "node": ">=14" 1430 + }, 1431 + "funding": { 1432 + "type": "github", 1433 + "url": "https://github.com/sponsors/gregberge" 1434 + }, 1435 + "peerDependencies": { 1436 + "@svgr/core": "*" 1437 + } 1438 + }, 1439 + "node_modules/@types/estree": { 1440 + "version": "1.0.5", 1441 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 1442 + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 1443 + "dev": true 1444 + }, 1445 + "node_modules/@types/node": { 1446 + "version": "20.16.5", 1447 + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", 1448 + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", 1449 + "dev": true, 1450 + "dependencies": { 1451 + "undici-types": "~6.19.2" 1452 + } 1453 + }, 1454 + "node_modules/@types/ws": { 1455 + "version": "8.5.12", 1456 + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", 1457 + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", 1458 + "dev": true, 1459 + "dependencies": { 1460 + "@types/node": "*" 1461 + } 1462 + }, 1463 + "node_modules/@vitest/expect": { 1464 + "version": "2.0.5", 1465 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", 1466 + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", 1467 + "dev": true, 1468 + "dependencies": { 1469 + "@vitest/spy": "2.0.5", 1470 + "@vitest/utils": "2.0.5", 1471 + "chai": "^5.1.1", 1472 + "tinyrainbow": "^1.2.0" 1473 + }, 1474 + "funding": { 1475 + "url": "https://opencollective.com/vitest" 1476 + } 1477 + }, 1478 + "node_modules/@vitest/pretty-format": { 1479 + "version": "2.0.5", 1480 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", 1481 + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", 1482 + "dev": true, 1483 + "dependencies": { 1484 + "tinyrainbow": "^1.2.0" 1485 + }, 1486 + "funding": { 1487 + "url": "https://opencollective.com/vitest" 1488 + } 1489 + }, 1490 + "node_modules/@vitest/runner": { 1491 + "version": "2.0.5", 1492 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", 1493 + "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", 1494 + "dev": true, 1495 + "dependencies": { 1496 + "@vitest/utils": "2.0.5", 1497 + "pathe": "^1.1.2" 1498 + }, 1499 + "funding": { 1500 + "url": "https://opencollective.com/vitest" 1501 + } 1502 + }, 1503 + "node_modules/@vitest/snapshot": { 1504 + "version": "2.0.5", 1505 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", 1506 + "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", 1507 + "dev": true, 1508 + "dependencies": { 1509 + "@vitest/pretty-format": "2.0.5", 1510 + "magic-string": "^0.30.10", 1511 + "pathe": "^1.1.2" 1512 + }, 1513 + "funding": { 1514 + "url": "https://opencollective.com/vitest" 1515 + } 1516 + }, 1517 + "node_modules/@vitest/snapshot/node_modules/magic-string": { 1518 + "version": "0.30.11", 1519 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", 1520 + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", 1521 + "dev": true, 1522 + "dependencies": { 1523 + "@jridgewell/sourcemap-codec": "^1.5.0" 1524 + } 1525 + }, 1526 + "node_modules/@vitest/spy": { 1527 + "version": "2.0.5", 1528 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", 1529 + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", 1530 + "dev": true, 1531 + "dependencies": { 1532 + "tinyspy": "^3.0.0" 1533 + }, 1534 + "funding": { 1535 + "url": "https://opencollective.com/vitest" 1536 + } 1537 + }, 1538 + "node_modules/@vitest/utils": { 1539 + "version": "2.0.5", 1540 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", 1541 + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", 1542 + "dev": true, 1543 + "dependencies": { 1544 + "@vitest/pretty-format": "2.0.5", 1545 + "estree-walker": "^3.0.3", 1546 + "loupe": "^3.1.1", 1547 + "tinyrainbow": "^1.2.0" 1548 + }, 1549 + "funding": { 1550 + "url": "https://opencollective.com/vitest" 1551 + } 1552 + }, 1553 + "node_modules/@vitest/utils/node_modules/estree-walker": { 1554 + "version": "3.0.3", 1555 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1556 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1557 + "dev": true, 1558 + "dependencies": { 1559 + "@types/estree": "^1.0.0" 1560 + } 1561 + }, 1562 + "node_modules/acorn": { 1563 + "version": "8.12.1", 1564 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 1565 + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 1566 + "dev": true, 1567 + "bin": { 1568 + "acorn": "bin/acorn" 1569 + }, 1570 + "engines": { 1571 + "node": ">=0.4.0" 1572 + } 1573 + }, 1574 + "node_modules/ansi-styles": { 1575 + "version": "3.2.1", 1576 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1577 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1578 + "dev": true, 1579 + "dependencies": { 1580 + "color-convert": "^1.9.0" 1581 + }, 1582 + "engines": { 1583 + "node": ">=4" 1584 + } 1585 + }, 1586 + "node_modules/argparse": { 1587 + "version": "2.0.1", 1588 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1589 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1590 + "dev": true 1591 + }, 1592 + "node_modules/assertion-error": { 1593 + "version": "2.0.1", 1594 + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 1595 + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 1596 + "dev": true, 1597 + "engines": { 1598 + "node": ">=12" 1599 + } 1600 + }, 1601 + "node_modules/async-mutex": { 1602 + "version": "0.5.0", 1603 + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", 1604 + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", 1605 + "dependencies": { 1606 + "tslib": "^2.4.0" 1607 + } 1608 + }, 1609 + "node_modules/babel-plugin-transform-hook-names": { 1610 + "version": "1.0.2", 1611 + "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", 1612 + "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", 1613 + "dev": true, 1614 + "peerDependencies": { 1615 + "@babel/core": "^7.12.10" 1616 + } 1617 + }, 1618 + "node_modules/boolbase": { 1619 + "version": "1.0.0", 1620 + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 1621 + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 1622 + "dev": true 1623 + }, 1624 + "node_modules/browserslist": { 1625 + "version": "4.23.3", 1626 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", 1627 + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", 1628 + "dev": true, 1629 + "funding": [ 1630 + { 1631 + "type": "opencollective", 1632 + "url": "https://opencollective.com/browserslist" 1633 + }, 1634 + { 1635 + "type": "tidelift", 1636 + "url": "https://tidelift.com/funding/github/npm/browserslist" 1637 + }, 1638 + { 1639 + "type": "github", 1640 + "url": "https://github.com/sponsors/ai" 1641 + } 1642 + ], 1643 + "dependencies": { 1644 + "caniuse-lite": "^1.0.30001646", 1645 + "electron-to-chromium": "^1.5.4", 1646 + "node-releases": "^2.0.18", 1647 + "update-browserslist-db": "^1.1.0" 1648 + }, 1649 + "bin": { 1650 + "browserslist": "cli.js" 1651 + }, 1652 + "engines": { 1653 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1654 + } 1655 + }, 1656 + "node_modules/cac": { 1657 + "version": "6.7.14", 1658 + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1659 + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1660 + "dev": true, 1661 + "engines": { 1662 + "node": ">=8" 1663 + } 1664 + }, 1665 + "node_modules/callsites": { 1666 + "version": "3.1.0", 1667 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1668 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1669 + "dev": true, 1670 + "engines": { 1671 + "node": ">=6" 1672 + } 1673 + }, 1674 + "node_modules/camelcase": { 1675 + "version": "6.3.0", 1676 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1677 + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1678 + "dev": true, 1679 + "engines": { 1680 + "node": ">=10" 1681 + }, 1682 + "funding": { 1683 + "url": "https://github.com/sponsors/sindresorhus" 1684 + } 1685 + }, 1686 + "node_modules/caniuse-lite": { 1687 + "version": "1.0.30001658", 1688 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz", 1689 + "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==", 1690 + "dev": true, 1691 + "funding": [ 1692 + { 1693 + "type": "opencollective", 1694 + "url": "https://opencollective.com/browserslist" 1695 + }, 1696 + { 1697 + "type": "tidelift", 1698 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1699 + }, 1700 + { 1701 + "type": "github", 1702 + "url": "https://github.com/sponsors/ai" 1703 + } 1704 + ] 1705 + }, 1706 + "node_modules/chai": { 1707 + "version": "5.1.1", 1708 + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", 1709 + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", 1710 + "dev": true, 1711 + "dependencies": { 1712 + "assertion-error": "^2.0.1", 1713 + "check-error": "^2.1.1", 1714 + "deep-eql": "^5.0.1", 1715 + "loupe": "^3.1.0", 1716 + "pathval": "^2.0.0" 1717 + }, 1718 + "engines": { 1719 + "node": ">=12" 1720 + } 1721 + }, 1722 + "node_modules/chalk": { 1723 + "version": "2.4.2", 1724 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1725 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1726 + "dev": true, 1727 + "dependencies": { 1728 + "ansi-styles": "^3.2.1", 1729 + "escape-string-regexp": "^1.0.5", 1730 + "supports-color": "^5.3.0" 1731 + }, 1732 + "engines": { 1733 + "node": ">=4" 1734 + } 1735 + }, 1736 + "node_modules/check-error": { 1737 + "version": "2.1.1", 1738 + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 1739 + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 1740 + "dev": true, 1741 + "engines": { 1742 + "node": ">= 16" 1743 + } 1744 + }, 1745 + "node_modules/color-convert": { 1746 + "version": "1.9.3", 1747 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1748 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1749 + "dev": true, 1750 + "dependencies": { 1751 + "color-name": "1.1.3" 1752 + } 1753 + }, 1754 + "node_modules/color-name": { 1755 + "version": "1.1.3", 1756 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1757 + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 1758 + "dev": true 1759 + }, 1760 + "node_modules/confbox": { 1761 + "version": "0.1.7", 1762 + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", 1763 + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", 1764 + "dev": true 1765 + }, 1766 + "node_modules/convert-source-map": { 1767 + "version": "2.0.0", 1768 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1769 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1770 + "dev": true 1771 + }, 1772 + "node_modules/cosmiconfig": { 1773 + "version": "8.3.6", 1774 + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", 1775 + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", 1776 + "dev": true, 1777 + "dependencies": { 1778 + "import-fresh": "^3.3.0", 1779 + "js-yaml": "^4.1.0", 1780 + "parse-json": "^5.2.0", 1781 + "path-type": "^4.0.0" 1782 + }, 1783 + "engines": { 1784 + "node": ">=14" 1785 + }, 1786 + "funding": { 1787 + "url": "https://github.com/sponsors/d-fischer" 1788 + }, 1789 + "peerDependencies": { 1790 + "typescript": ">=4.9.5" 1791 + }, 1792 + "peerDependenciesMeta": { 1793 + "typescript": { 1794 + "optional": true 1795 + } 1796 + } 1797 + }, 1798 + "node_modules/cross-spawn": { 1799 + "version": "7.0.3", 1800 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1801 + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1802 + "dev": true, 1803 + "dependencies": { 1804 + "path-key": "^3.1.0", 1805 + "shebang-command": "^2.0.0", 1806 + "which": "^2.0.1" 1807 + }, 1808 + "engines": { 1809 + "node": ">= 8" 1810 + } 1811 + }, 1812 + "node_modules/css-select": { 1813 + "version": "5.1.0", 1814 + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", 1815 + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", 1816 + "dev": true, 1817 + "dependencies": { 1818 + "boolbase": "^1.0.0", 1819 + "css-what": "^6.1.0", 1820 + "domhandler": "^5.0.2", 1821 + "domutils": "^3.0.1", 1822 + "nth-check": "^2.0.1" 1823 + }, 1824 + "funding": { 1825 + "url": "https://github.com/sponsors/fb55" 1826 + } 1827 + }, 1828 + "node_modules/css-what": { 1829 + "version": "6.1.0", 1830 + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", 1831 + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", 1832 + "dev": true, 1833 + "engines": { 1834 + "node": ">= 6" 1835 + }, 1836 + "funding": { 1837 + "url": "https://github.com/sponsors/fb55" 1838 + } 1839 + }, 1840 + "node_modules/dayjs": { 1841 + "version": "1.11.13", 1842 + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", 1843 + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" 1844 + }, 1845 + "node_modules/debug": { 1846 + "version": "4.3.7", 1847 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1848 + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1849 + "dev": true, 1850 + "dependencies": { 1851 + "ms": "^2.1.3" 1852 + }, 1853 + "engines": { 1854 + "node": ">=6.0" 1855 + }, 1856 + "peerDependenciesMeta": { 1857 + "supports-color": { 1858 + "optional": true 1859 + } 1860 + } 1861 + }, 1862 + "node_modules/deep-eql": { 1863 + "version": "5.0.2", 1864 + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 1865 + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 1866 + "dev": true, 1867 + "engines": { 1868 + "node": ">=6" 1869 + } 1870 + }, 1871 + "node_modules/dexie": { 1872 + "version": "4.0.8", 1873 + "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.0.8.tgz", 1874 + "integrity": "sha512-1G6cJevS17KMDK847V3OHvK2zei899GwpDiqfEXHP1ASvme6eWJmAp9AU4s1son2TeGkWmC0g3y8ezOBPnalgQ==" 1875 + }, 1876 + "node_modules/dom-serializer": { 1877 + "version": "2.0.0", 1878 + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 1879 + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 1880 + "dev": true, 1881 + "dependencies": { 1882 + "domelementtype": "^2.3.0", 1883 + "domhandler": "^5.0.2", 1884 + "entities": "^4.2.0" 1885 + }, 1886 + "funding": { 1887 + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 1888 + } 1889 + }, 1890 + "node_modules/domelementtype": { 1891 + "version": "2.3.0", 1892 + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 1893 + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 1894 + "dev": true, 1895 + "funding": [ 1896 + { 1897 + "type": "github", 1898 + "url": "https://github.com/sponsors/fb55" 1899 + } 1900 + ] 1901 + }, 1902 + "node_modules/domhandler": { 1903 + "version": "5.0.3", 1904 + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 1905 + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 1906 + "dev": true, 1907 + "dependencies": { 1908 + "domelementtype": "^2.3.0" 1909 + }, 1910 + "engines": { 1911 + "node": ">= 4" 1912 + }, 1913 + "funding": { 1914 + "url": "https://github.com/fb55/domhandler?sponsor=1" 1915 + } 1916 + }, 1917 + "node_modules/domutils": { 1918 + "version": "3.1.0", 1919 + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", 1920 + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", 1921 + "dev": true, 1922 + "dependencies": { 1923 + "dom-serializer": "^2.0.0", 1924 + "domelementtype": "^2.3.0", 1925 + "domhandler": "^5.0.3" 1926 + }, 1927 + "funding": { 1928 + "url": "https://github.com/fb55/domutils?sponsor=1" 1929 + } 1930 + }, 1931 + "node_modules/dot-case": { 1932 + "version": "3.0.4", 1933 + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 1934 + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 1935 + "dev": true, 1936 + "dependencies": { 1937 + "no-case": "^3.0.4", 1938 + "tslib": "^2.0.3" 1939 + } 1940 + }, 1941 + "node_modules/electron-to-chromium": { 1942 + "version": "1.5.18", 1943 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.18.tgz", 1944 + "integrity": "sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==", 1945 + "dev": true 1946 + }, 1947 + "node_modules/entities": { 1948 + "version": "4.5.0", 1949 + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1950 + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 1951 + "dev": true, 1952 + "engines": { 1953 + "node": ">=0.12" 1954 + }, 1955 + "funding": { 1956 + "url": "https://github.com/fb55/entities?sponsor=1" 1957 + } 1958 + }, 1959 + "node_modules/error-ex": { 1960 + "version": "1.3.2", 1961 + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1962 + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1963 + "dev": true, 1964 + "dependencies": { 1965 + "is-arrayish": "^0.2.1" 1966 + } 1967 + }, 1968 + "node_modules/esbuild": { 1969 + "version": "0.21.5", 1970 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", 1971 + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", 1972 + "dev": true, 1973 + "hasInstallScript": true, 1974 + "bin": { 1975 + "esbuild": "bin/esbuild" 1976 + }, 1977 + "engines": { 1978 + "node": ">=12" 1979 + }, 1980 + "optionalDependencies": { 1981 + "@esbuild/aix-ppc64": "0.21.5", 1982 + "@esbuild/android-arm": "0.21.5", 1983 + "@esbuild/android-arm64": "0.21.5", 1984 + "@esbuild/android-x64": "0.21.5", 1985 + "@esbuild/darwin-arm64": "0.21.5", 1986 + "@esbuild/darwin-x64": "0.21.5", 1987 + "@esbuild/freebsd-arm64": "0.21.5", 1988 + "@esbuild/freebsd-x64": "0.21.5", 1989 + "@esbuild/linux-arm": "0.21.5", 1990 + "@esbuild/linux-arm64": "0.21.5", 1991 + "@esbuild/linux-ia32": "0.21.5", 1992 + "@esbuild/linux-loong64": "0.21.5", 1993 + "@esbuild/linux-mips64el": "0.21.5", 1994 + "@esbuild/linux-ppc64": "0.21.5", 1995 + "@esbuild/linux-riscv64": "0.21.5", 1996 + "@esbuild/linux-s390x": "0.21.5", 1997 + "@esbuild/linux-x64": "0.21.5", 1998 + "@esbuild/netbsd-x64": "0.21.5", 1999 + "@esbuild/openbsd-x64": "0.21.5", 2000 + "@esbuild/sunos-x64": "0.21.5", 2001 + "@esbuild/win32-arm64": "0.21.5", 2002 + "@esbuild/win32-ia32": "0.21.5", 2003 + "@esbuild/win32-x64": "0.21.5" 2004 + } 2005 + }, 2006 + "node_modules/escalade": { 2007 + "version": "3.2.0", 2008 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 2009 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 2010 + "dev": true, 2011 + "engines": { 2012 + "node": ">=6" 2013 + } 2014 + }, 2015 + "node_modules/escape-string-regexp": { 2016 + "version": "1.0.5", 2017 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2018 + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 2019 + "dev": true, 2020 + "engines": { 2021 + "node": ">=0.8.0" 2022 + } 2023 + }, 2024 + "node_modules/estree-walker": { 2025 + "version": "2.0.2", 2026 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 2027 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 2028 + "dev": true 2029 + }, 2030 + "node_modules/execa": { 2031 + "version": "8.0.1", 2032 + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", 2033 + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", 2034 + "dev": true, 2035 + "dependencies": { 2036 + "cross-spawn": "^7.0.3", 2037 + "get-stream": "^8.0.1", 2038 + "human-signals": "^5.0.0", 2039 + "is-stream": "^3.0.0", 2040 + "merge-stream": "^2.0.0", 2041 + "npm-run-path": "^5.1.0", 2042 + "onetime": "^6.0.0", 2043 + "signal-exit": "^4.1.0", 2044 + "strip-final-newline": "^3.0.0" 2045 + }, 2046 + "engines": { 2047 + "node": ">=16.17" 2048 + }, 2049 + "funding": { 2050 + "url": "https://github.com/sindresorhus/execa?sponsor=1" 2051 + } 2052 + }, 2053 + "node_modules/fsevents": { 2054 + "version": "2.3.3", 2055 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2056 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2057 + "dev": true, 2058 + "hasInstallScript": true, 2059 + "optional": true, 2060 + "os": [ 2061 + "darwin" 2062 + ], 2063 + "engines": { 2064 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2065 + } 2066 + }, 2067 + "node_modules/function-bind": { 2068 + "version": "1.1.2", 2069 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 2070 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 2071 + "dev": true, 2072 + "funding": { 2073 + "url": "https://github.com/sponsors/ljharb" 2074 + } 2075 + }, 2076 + "node_modules/gensync": { 2077 + "version": "1.0.0-beta.2", 2078 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2079 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2080 + "dev": true, 2081 + "engines": { 2082 + "node": ">=6.9.0" 2083 + } 2084 + }, 2085 + "node_modules/get-func-name": { 2086 + "version": "2.0.2", 2087 + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", 2088 + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", 2089 + "dev": true, 2090 + "engines": { 2091 + "node": "*" 2092 + } 2093 + }, 2094 + "node_modules/get-stream": { 2095 + "version": "8.0.1", 2096 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", 2097 + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", 2098 + "dev": true, 2099 + "engines": { 2100 + "node": ">=16" 2101 + }, 2102 + "funding": { 2103 + "url": "https://github.com/sponsors/sindresorhus" 2104 + } 2105 + }, 2106 + "node_modules/globals": { 2107 + "version": "11.12.0", 2108 + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2109 + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2110 + "dev": true, 2111 + "engines": { 2112 + "node": ">=4" 2113 + } 2114 + }, 2115 + "node_modules/happy-dom": { 2116 + "version": "14.12.3", 2117 + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-14.12.3.tgz", 2118 + "integrity": "sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==", 2119 + "dev": true, 2120 + "dependencies": { 2121 + "entities": "^4.5.0", 2122 + "webidl-conversions": "^7.0.0", 2123 + "whatwg-mimetype": "^3.0.0" 2124 + }, 2125 + "engines": { 2126 + "node": ">=16.0.0" 2127 + } 2128 + }, 2129 + "node_modules/has-flag": { 2130 + "version": "3.0.0", 2131 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2132 + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2133 + "dev": true, 2134 + "engines": { 2135 + "node": ">=4" 2136 + } 2137 + }, 2138 + "node_modules/hasown": { 2139 + "version": "2.0.2", 2140 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2141 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2142 + "dev": true, 2143 + "dependencies": { 2144 + "function-bind": "^1.1.2" 2145 + }, 2146 + "engines": { 2147 + "node": ">= 0.4" 2148 + } 2149 + }, 2150 + "node_modules/he": { 2151 + "version": "1.2.0", 2152 + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 2153 + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 2154 + "dev": true, 2155 + "bin": { 2156 + "he": "bin/he" 2157 + } 2158 + }, 2159 + "node_modules/hey-listen": { 2160 + "version": "1.0.8", 2161 + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", 2162 + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" 2163 + }, 2164 + "node_modules/human-signals": { 2165 + "version": "5.0.0", 2166 + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", 2167 + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", 2168 + "dev": true, 2169 + "engines": { 2170 + "node": ">=16.17.0" 2171 + } 2172 + }, 2173 + "node_modules/import-fresh": { 2174 + "version": "3.3.0", 2175 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2176 + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2177 + "dev": true, 2178 + "dependencies": { 2179 + "parent-module": "^1.0.0", 2180 + "resolve-from": "^4.0.0" 2181 + }, 2182 + "engines": { 2183 + "node": ">=6" 2184 + }, 2185 + "funding": { 2186 + "url": "https://github.com/sponsors/sindresorhus" 2187 + } 2188 + }, 2189 + "node_modules/is-arrayish": { 2190 + "version": "0.2.1", 2191 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 2192 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 2193 + "dev": true 2194 + }, 2195 + "node_modules/is-core-module": { 2196 + "version": "2.15.1", 2197 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", 2198 + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", 2199 + "dev": true, 2200 + "dependencies": { 2201 + "hasown": "^2.0.2" 2202 + }, 2203 + "engines": { 2204 + "node": ">= 0.4" 2205 + }, 2206 + "funding": { 2207 + "url": "https://github.com/sponsors/ljharb" 2208 + } 2209 + }, 2210 + "node_modules/is-stream": { 2211 + "version": "3.0.0", 2212 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", 2213 + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", 2214 + "dev": true, 2215 + "engines": { 2216 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2217 + }, 2218 + "funding": { 2219 + "url": "https://github.com/sponsors/sindresorhus" 2220 + } 2221 + }, 2222 + "node_modules/isexe": { 2223 + "version": "2.0.0", 2224 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2225 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2226 + "dev": true 2227 + }, 2228 + "node_modules/isomorphic-ws": { 2229 + "version": "5.0.0", 2230 + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", 2231 + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", 2232 + "peerDependencies": { 2233 + "ws": "*" 2234 + } 2235 + }, 2236 + "node_modules/js-tokens": { 2237 + "version": "4.0.0", 2238 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2239 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2240 + "dev": true 2241 + }, 2242 + "node_modules/js-yaml": { 2243 + "version": "4.1.0", 2244 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2245 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2246 + "dev": true, 2247 + "dependencies": { 2248 + "argparse": "^2.0.1" 2249 + }, 2250 + "bin": { 2251 + "js-yaml": "bin/js-yaml.js" 2252 + } 2253 + }, 2254 + "node_modules/jsesc": { 2255 + "version": "2.5.2", 2256 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2257 + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2258 + "dev": true, 2259 + "bin": { 2260 + "jsesc": "bin/jsesc" 2261 + }, 2262 + "engines": { 2263 + "node": ">=4" 2264 + } 2265 + }, 2266 + "node_modules/json-parse-even-better-errors": { 2267 + "version": "2.3.1", 2268 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2269 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2270 + "dev": true 2271 + }, 2272 + "node_modules/json5": { 2273 + "version": "2.2.3", 2274 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2275 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2276 + "dev": true, 2277 + "bin": { 2278 + "json5": "lib/cli.js" 2279 + }, 2280 + "engines": { 2281 + "node": ">=6" 2282 + } 2283 + }, 2284 + "node_modules/kolorist": { 2285 + "version": "1.8.0", 2286 + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", 2287 + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", 2288 + "dev": true 2289 + }, 2290 + "node_modules/lines-and-columns": { 2291 + "version": "1.2.4", 2292 + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2293 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2294 + "dev": true 2295 + }, 2296 + "node_modules/local-pkg": { 2297 + "version": "0.5.0", 2298 + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", 2299 + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", 2300 + "dev": true, 2301 + "dependencies": { 2302 + "mlly": "^1.4.2", 2303 + "pkg-types": "^1.0.3" 2304 + }, 2305 + "engines": { 2306 + "node": ">=14" 2307 + }, 2308 + "funding": { 2309 + "url": "https://github.com/sponsors/antfu" 2310 + } 2311 + }, 2312 + "node_modules/loupe": { 2313 + "version": "3.1.1", 2314 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", 2315 + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", 2316 + "dev": true, 2317 + "dependencies": { 2318 + "get-func-name": "^2.0.1" 2319 + } 2320 + }, 2321 + "node_modules/lower-case": { 2322 + "version": "2.0.2", 2323 + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 2324 + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 2325 + "dev": true, 2326 + "dependencies": { 2327 + "tslib": "^2.0.3" 2328 + } 2329 + }, 2330 + "node_modules/lru-cache": { 2331 + "version": "5.1.1", 2332 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2333 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2334 + "dev": true, 2335 + "dependencies": { 2336 + "yallist": "^3.0.2" 2337 + } 2338 + }, 2339 + "node_modules/magic-string": { 2340 + "version": "0.30.5", 2341 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", 2342 + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", 2343 + "dev": true, 2344 + "dependencies": { 2345 + "@jridgewell/sourcemap-codec": "^1.4.15" 2346 + }, 2347 + "engines": { 2348 + "node": ">=12" 2349 + } 2350 + }, 2351 + "node_modules/merge-stream": { 2352 + "version": "2.0.0", 2353 + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2354 + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2355 + "dev": true 2356 + }, 2357 + "node_modules/mimic-fn": { 2358 + "version": "4.0.0", 2359 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", 2360 + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", 2361 + "dev": true, 2362 + "engines": { 2363 + "node": ">=12" 2364 + }, 2365 + "funding": { 2366 + "url": "https://github.com/sponsors/sindresorhus" 2367 + } 2368 + }, 2369 + "node_modules/mitt": { 2370 + "version": "3.0.1", 2371 + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", 2372 + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" 2373 + }, 2374 + "node_modules/mlly": { 2375 + "version": "1.7.1", 2376 + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", 2377 + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", 2378 + "dev": true, 2379 + "dependencies": { 2380 + "acorn": "^8.11.3", 2381 + "pathe": "^1.1.2", 2382 + "pkg-types": "^1.1.1", 2383 + "ufo": "^1.5.3" 2384 + } 2385 + }, 2386 + "node_modules/motion": { 2387 + "version": "10.18.0", 2388 + "resolved": "https://registry.npmjs.org/motion/-/motion-10.18.0.tgz", 2389 + "integrity": "sha512-MVAZZmwM/cp77BrNe1TxTMldxRPjwBNHheU5aPToqT4rJdZxLiADk58H+a0al5jKLxkB0OdgNq6DiVn11cjvIQ==", 2390 + "dependencies": { 2391 + "@motionone/animation": "^10.18.0", 2392 + "@motionone/dom": "^10.18.0", 2393 + "@motionone/types": "^10.17.1", 2394 + "@motionone/utils": "^10.18.0" 2395 + } 2396 + }, 2397 + "node_modules/ms": { 2398 + "version": "2.1.3", 2399 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2400 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2401 + "dev": true 2402 + }, 2403 + "node_modules/nanoid": { 2404 + "version": "5.0.7", 2405 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", 2406 + "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", 2407 + "funding": [ 2408 + { 2409 + "type": "github", 2410 + "url": "https://github.com/sponsors/ai" 2411 + } 2412 + ], 2413 + "bin": { 2414 + "nanoid": "bin/nanoid.js" 2415 + }, 2416 + "engines": { 2417 + "node": "^18 || >=20" 2418 + } 2419 + }, 2420 + "node_modules/neotubes": { 2421 + "resolved": "neo", 2422 + "link": true 2423 + }, 2424 + "node_modules/no-case": { 2425 + "version": "3.0.4", 2426 + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 2427 + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 2428 + "dev": true, 2429 + "dependencies": { 2430 + "lower-case": "^2.0.2", 2431 + "tslib": "^2.0.3" 2432 + } 2433 + }, 2434 + "node_modules/node-html-parser": { 2435 + "version": "6.1.13", 2436 + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", 2437 + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", 2438 + "dev": true, 2439 + "dependencies": { 2440 + "css-select": "^5.1.0", 2441 + "he": "1.2.0" 2442 + } 2443 + }, 2444 + "node_modules/node-releases": { 2445 + "version": "2.0.18", 2446 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", 2447 + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", 2448 + "dev": true 2449 + }, 2450 + "node_modules/npm-run-path": { 2451 + "version": "5.3.0", 2452 + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", 2453 + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", 2454 + "dev": true, 2455 + "dependencies": { 2456 + "path-key": "^4.0.0" 2457 + }, 2458 + "engines": { 2459 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2460 + }, 2461 + "funding": { 2462 + "url": "https://github.com/sponsors/sindresorhus" 2463 + } 2464 + }, 2465 + "node_modules/npm-run-path/node_modules/path-key": { 2466 + "version": "4.0.0", 2467 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", 2468 + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 2469 + "dev": true, 2470 + "engines": { 2471 + "node": ">=12" 2472 + }, 2473 + "funding": { 2474 + "url": "https://github.com/sponsors/sindresorhus" 2475 + } 2476 + }, 2477 + "node_modules/nth-check": { 2478 + "version": "2.1.1", 2479 + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 2480 + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 2481 + "dev": true, 2482 + "dependencies": { 2483 + "boolbase": "^1.0.0" 2484 + }, 2485 + "funding": { 2486 + "url": "https://github.com/fb55/nth-check?sponsor=1" 2487 + } 2488 + }, 2489 + "node_modules/onetime": { 2490 + "version": "6.0.0", 2491 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", 2492 + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", 2493 + "dev": true, 2494 + "dependencies": { 2495 + "mimic-fn": "^4.0.0" 2496 + }, 2497 + "engines": { 2498 + "node": ">=12" 2499 + }, 2500 + "funding": { 2501 + "url": "https://github.com/sponsors/sindresorhus" 2502 + } 2503 + }, 2504 + "node_modules/package-manager-detector": { 2505 + "version": "0.2.0", 2506 + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.0.tgz", 2507 + "integrity": "sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==", 2508 + "dev": true 2509 + }, 2510 + "node_modules/parent-module": { 2511 + "version": "1.0.1", 2512 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2513 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2514 + "dev": true, 2515 + "dependencies": { 2516 + "callsites": "^3.0.0" 2517 + }, 2518 + "engines": { 2519 + "node": ">=6" 2520 + } 2521 + }, 2522 + "node_modules/parse-json": { 2523 + "version": "5.2.0", 2524 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 2525 + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 2526 + "dev": true, 2527 + "dependencies": { 2528 + "@babel/code-frame": "^7.0.0", 2529 + "error-ex": "^1.3.1", 2530 + "json-parse-even-better-errors": "^2.3.0", 2531 + "lines-and-columns": "^1.1.6" 2532 + }, 2533 + "engines": { 2534 + "node": ">=8" 2535 + }, 2536 + "funding": { 2537 + "url": "https://github.com/sponsors/sindresorhus" 2538 + } 2539 + }, 2540 + "node_modules/path-key": { 2541 + "version": "3.1.1", 2542 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2543 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2544 + "dev": true, 2545 + "engines": { 2546 + "node": ">=8" 2547 + } 2548 + }, 2549 + "node_modules/path-parse": { 2550 + "version": "1.0.7", 2551 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2552 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2553 + "dev": true 2554 + }, 2555 + "node_modules/path-type": { 2556 + "version": "4.0.0", 2557 + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2558 + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2559 + "dev": true, 2560 + "engines": { 2561 + "node": ">=8" 2562 + } 2563 + }, 2564 + "node_modules/pathe": { 2565 + "version": "1.1.2", 2566 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", 2567 + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", 2568 + "dev": true 2569 + }, 2570 + "node_modules/pathval": { 2571 + "version": "2.0.0", 2572 + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", 2573 + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", 2574 + "dev": true, 2575 + "engines": { 2576 + "node": ">= 14.16" 2577 + } 2578 + }, 2579 + "node_modules/picocolors": { 2580 + "version": "1.1.0", 2581 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 2582 + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 2583 + "dev": true 2584 + }, 2585 + "node_modules/picomatch": { 2586 + "version": "2.3.1", 2587 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2588 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2589 + "dev": true, 2590 + "engines": { 2591 + "node": ">=8.6" 2592 + }, 2593 + "funding": { 2594 + "url": "https://github.com/sponsors/jonschlinkert" 2595 + } 2596 + }, 2597 + "node_modules/pkg-types": { 2598 + "version": "1.2.0", 2599 + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", 2600 + "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", 2601 + "dev": true, 2602 + "dependencies": { 2603 + "confbox": "^0.1.7", 2604 + "mlly": "^1.7.1", 2605 + "pathe": "^1.1.2" 2606 + } 2607 + }, 2608 + "node_modules/postcss": { 2609 + "version": "8.4.45", 2610 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", 2611 + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", 2612 + "dev": true, 2613 + "funding": [ 2614 + { 2615 + "type": "opencollective", 2616 + "url": "https://opencollective.com/postcss/" 2617 + }, 2618 + { 2619 + "type": "tidelift", 2620 + "url": "https://tidelift.com/funding/github/npm/postcss" 2621 + }, 2622 + { 2623 + "type": "github", 2624 + "url": "https://github.com/sponsors/ai" 2625 + } 2626 + ], 2627 + "dependencies": { 2628 + "nanoid": "^3.3.7", 2629 + "picocolors": "^1.0.1", 2630 + "source-map-js": "^1.2.0" 2631 + }, 2632 + "engines": { 2633 + "node": "^10 || ^12 || >=14" 2634 + } 2635 + }, 2636 + "node_modules/postcss/node_modules/nanoid": { 2637 + "version": "3.3.7", 2638 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2639 + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2640 + "dev": true, 2641 + "funding": [ 2642 + { 2643 + "type": "github", 2644 + "url": "https://github.com/sponsors/ai" 2645 + } 2646 + ], 2647 + "bin": { 2648 + "nanoid": "bin/nanoid.cjs" 2649 + }, 2650 + "engines": { 2651 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2652 + } 2653 + }, 2654 + "node_modules/preact": { 2655 + "version": "10.23.2", 2656 + "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.2.tgz", 2657 + "integrity": "sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==", 2658 + "funding": { 2659 + "type": "opencollective", 2660 + "url": "https://opencollective.com/preact" 2661 + } 2662 + }, 2663 + "node_modules/regexparam": { 2664 + "version": "3.0.0", 2665 + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", 2666 + "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", 2667 + "engines": { 2668 + "node": ">=8" 2669 + } 2670 + }, 2671 + "node_modules/resolve": { 2672 + "version": "1.22.8", 2673 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 2674 + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 2675 + "dev": true, 2676 + "dependencies": { 2677 + "is-core-module": "^2.13.0", 2678 + "path-parse": "^1.0.7", 2679 + "supports-preserve-symlinks-flag": "^1.0.0" 2680 + }, 2681 + "bin": { 2682 + "resolve": "bin/resolve" 2683 + }, 2684 + "funding": { 2685 + "url": "https://github.com/sponsors/ljharb" 2686 + } 2687 + }, 2688 + "node_modules/resolve-from": { 2689 + "version": "4.0.0", 2690 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2691 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2692 + "dev": true, 2693 + "engines": { 2694 + "node": ">=4" 2695 + } 2696 + }, 2697 + "node_modules/rollup": { 2698 + "version": "4.21.2", 2699 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", 2700 + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", 2701 + "dev": true, 2702 + "dependencies": { 2703 + "@types/estree": "1.0.5" 2704 + }, 2705 + "bin": { 2706 + "rollup": "dist/bin/rollup" 2707 + }, 2708 + "engines": { 2709 + "node": ">=18.0.0", 2710 + "npm": ">=8.0.0" 2711 + }, 2712 + "optionalDependencies": { 2713 + "@rollup/rollup-android-arm-eabi": "4.21.2", 2714 + "@rollup/rollup-android-arm64": "4.21.2", 2715 + "@rollup/rollup-darwin-arm64": "4.21.2", 2716 + "@rollup/rollup-darwin-x64": "4.21.2", 2717 + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", 2718 + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", 2719 + "@rollup/rollup-linux-arm64-gnu": "4.21.2", 2720 + "@rollup/rollup-linux-arm64-musl": "4.21.2", 2721 + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", 2722 + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", 2723 + "@rollup/rollup-linux-s390x-gnu": "4.21.2", 2724 + "@rollup/rollup-linux-x64-gnu": "4.21.2", 2725 + "@rollup/rollup-linux-x64-musl": "4.21.2", 2726 + "@rollup/rollup-win32-arm64-msvc": "4.21.2", 2727 + "@rollup/rollup-win32-ia32-msvc": "4.21.2", 2728 + "@rollup/rollup-win32-x64-msvc": "4.21.2", 2729 + "fsevents": "~2.3.2" 2730 + } 2731 + }, 2732 + "node_modules/semver": { 2733 + "version": "6.3.1", 2734 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2735 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2736 + "dev": true, 2737 + "bin": { 2738 + "semver": "bin/semver.js" 2739 + } 2740 + }, 2741 + "node_modules/shebang-command": { 2742 + "version": "2.0.0", 2743 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2744 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2745 + "dev": true, 2746 + "dependencies": { 2747 + "shebang-regex": "^3.0.0" 2748 + }, 2749 + "engines": { 2750 + "node": ">=8" 2751 + } 2752 + }, 2753 + "node_modules/shebang-regex": { 2754 + "version": "3.0.0", 2755 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2756 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2757 + "dev": true, 2758 + "engines": { 2759 + "node": ">=8" 2760 + } 2761 + }, 2762 + "node_modules/siginfo": { 2763 + "version": "2.0.0", 2764 + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 2765 + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 2766 + "dev": true 2767 + }, 2768 + "node_modules/signal-exit": { 2769 + "version": "4.1.0", 2770 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2771 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2772 + "dev": true, 2773 + "engines": { 2774 + "node": ">=14" 2775 + }, 2776 + "funding": { 2777 + "url": "https://github.com/sponsors/isaacs" 2778 + } 2779 + }, 2780 + "node_modules/snake-case": { 2781 + "version": "3.0.4", 2782 + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", 2783 + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", 2784 + "dev": true, 2785 + "dependencies": { 2786 + "dot-case": "^3.0.4", 2787 + "tslib": "^2.0.3" 2788 + } 2789 + }, 2790 + "node_modules/source-map": { 2791 + "version": "0.7.4", 2792 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", 2793 + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", 2794 + "dev": true, 2795 + "engines": { 2796 + "node": ">= 8" 2797 + } 2798 + }, 2799 + "node_modules/source-map-js": { 2800 + "version": "1.2.0", 2801 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 2802 + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 2803 + "dev": true, 2804 + "engines": { 2805 + "node": ">=0.10.0" 2806 + } 2807 + }, 2808 + "node_modules/stack-trace": { 2809 + "version": "1.0.0-pre2", 2810 + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", 2811 + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", 2812 + "dev": true, 2813 + "engines": { 2814 + "node": ">=16" 2815 + } 2816 + }, 2817 + "node_modules/stackback": { 2818 + "version": "0.0.2", 2819 + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 2820 + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 2821 + "dev": true 2822 + }, 2823 + "node_modules/std-env": { 2824 + "version": "3.7.0", 2825 + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", 2826 + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", 2827 + "dev": true 2828 + }, 2829 + "node_modules/strip-final-newline": { 2830 + "version": "3.0.0", 2831 + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", 2832 + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", 2833 + "dev": true, 2834 + "engines": { 2835 + "node": ">=12" 2836 + }, 2837 + "funding": { 2838 + "url": "https://github.com/sponsors/sindresorhus" 2839 + } 2840 + }, 2841 + "node_modules/supports-color": { 2842 + "version": "5.5.0", 2843 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2844 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2845 + "dev": true, 2846 + "dependencies": { 2847 + "has-flag": "^3.0.0" 2848 + }, 2849 + "engines": { 2850 + "node": ">=4" 2851 + } 2852 + }, 2853 + "node_modules/supports-preserve-symlinks-flag": { 2854 + "version": "1.0.0", 2855 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2856 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2857 + "dev": true, 2858 + "engines": { 2859 + "node": ">= 0.4" 2860 + }, 2861 + "funding": { 2862 + "url": "https://github.com/sponsors/ljharb" 2863 + } 2864 + }, 2865 + "node_modules/svg-parser": { 2866 + "version": "2.0.4", 2867 + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", 2868 + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", 2869 + "dev": true 2870 + }, 2871 + "node_modules/tinybench": { 2872 + "version": "2.9.0", 2873 + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 2874 + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 2875 + "dev": true 2876 + }, 2877 + "node_modules/tinyexec": { 2878 + "version": "0.3.0", 2879 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", 2880 + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", 2881 + "dev": true 2882 + }, 2883 + "node_modules/tinypool": { 2884 + "version": "1.0.1", 2885 + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", 2886 + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", 2887 + "dev": true, 2888 + "engines": { 2889 + "node": "^18.0.0 || >=20.0.0" 2890 + } 2891 + }, 2892 + "node_modules/tinyrainbow": { 2893 + "version": "1.2.0", 2894 + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", 2895 + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", 2896 + "dev": true, 2897 + "engines": { 2898 + "node": ">=14.0.0" 2899 + } 2900 + }, 2901 + "node_modules/tinyspy": { 2902 + "version": "3.0.0", 2903 + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", 2904 + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", 2905 + "dev": true, 2906 + "engines": { 2907 + "node": ">=14.0.0" 2908 + } 2909 + }, 2910 + "node_modules/to-fast-properties": { 2911 + "version": "2.0.0", 2912 + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2913 + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2914 + "dev": true, 2915 + "engines": { 2916 + "node": ">=4" 2917 + } 2918 + }, 2919 + "node_modules/tslib": { 2920 + "version": "2.7.0", 2921 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", 2922 + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" 2923 + }, 2924 + "node_modules/tubes_core": { 2925 + "resolved": "core", 2926 + "link": true 2927 + }, 2928 + "node_modules/typescript": { 2929 + "version": "5.5.4", 2930 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", 2931 + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", 2932 + "dev": true, 2933 + "bin": { 2934 + "tsc": "bin/tsc", 2935 + "tsserver": "bin/tsserver" 2936 + }, 2937 + "engines": { 2938 + "node": ">=14.17" 2939 + } 2940 + }, 2941 + "node_modules/ufo": { 2942 + "version": "1.5.4", 2943 + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", 2944 + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", 2945 + "dev": true 2946 + }, 2947 + "node_modules/undici-types": { 2948 + "version": "6.19.8", 2949 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 2950 + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 2951 + "dev": true 2952 + }, 2953 + "node_modules/unplugin": { 2954 + "version": "1.13.1", 2955 + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.13.1.tgz", 2956 + "integrity": "sha512-6Kq1iSSwg7KyjcThRUks9LuqDAKvtnioxbL9iEtB9ctTyBA5OmrB8gZd/d225VJu1w3UpUsKV7eGrvf59J7+VA==", 2957 + "dev": true, 2958 + "dependencies": { 2959 + "acorn": "^8.12.1", 2960 + "webpack-virtual-modules": "^0.6.2" 2961 + }, 2962 + "engines": { 2963 + "node": ">=14.0.0" 2964 + }, 2965 + "peerDependencies": { 2966 + "webpack-sources": "^3" 2967 + }, 2968 + "peerDependenciesMeta": { 2969 + "webpack-sources": { 2970 + "optional": true 2971 + } 2972 + } 2973 + }, 2974 + "node_modules/unplugin-icons": { 2975 + "version": "0.19.3", 2976 + "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-0.19.3.tgz", 2977 + "integrity": "sha512-EUegRmsAI6+rrYr0vXjFlIP+lg4fSC4zb62zAZKx8FGXlWAGgEGBCa3JDe27aRAXhistObLPbBPhwa/0jYLFkQ==", 2978 + "dev": true, 2979 + "dependencies": { 2980 + "@antfu/install-pkg": "^0.4.1", 2981 + "@antfu/utils": "^0.7.10", 2982 + "@iconify/utils": "^2.1.29", 2983 + "debug": "^4.3.6", 2984 + "kolorist": "^1.8.0", 2985 + "local-pkg": "^0.5.0", 2986 + "unplugin": "^1.12.0" 2987 + }, 2988 + "funding": { 2989 + "url": "https://github.com/sponsors/antfu" 2990 + }, 2991 + "peerDependencies": { 2992 + "@svgr/core": ">=7.0.0", 2993 + "@svgx/core": "^1.0.1", 2994 + "@vue/compiler-sfc": "^3.0.2 || ^2.7.0", 2995 + "vue-template-compiler": "^2.6.12", 2996 + "vue-template-es2015-compiler": "^1.9.0" 2997 + }, 2998 + "peerDependenciesMeta": { 2999 + "@svgr/core": { 3000 + "optional": true 3001 + }, 3002 + "@svgx/core": { 3003 + "optional": true 3004 + }, 3005 + "@vue/compiler-sfc": { 3006 + "optional": true 3007 + }, 3008 + "vue-template-compiler": { 3009 + "optional": true 3010 + }, 3011 + "vue-template-es2015-compiler": { 3012 + "optional": true 3013 + } 3014 + } 3015 + }, 3016 + "node_modules/update-browserslist-db": { 3017 + "version": "1.1.0", 3018 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", 3019 + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", 3020 + "dev": true, 3021 + "funding": [ 3022 + { 3023 + "type": "opencollective", 3024 + "url": "https://opencollective.com/browserslist" 3025 + }, 3026 + { 3027 + "type": "tidelift", 3028 + "url": "https://tidelift.com/funding/github/npm/browserslist" 3029 + }, 3030 + { 3031 + "type": "github", 3032 + "url": "https://github.com/sponsors/ai" 3033 + } 3034 + ], 3035 + "dependencies": { 3036 + "escalade": "^3.1.2", 3037 + "picocolors": "^1.0.1" 3038 + }, 3039 + "bin": { 3040 + "update-browserslist-db": "cli.js" 3041 + }, 3042 + "peerDependencies": { 3043 + "browserslist": ">= 4.21.0" 3044 + } 3045 + }, 3046 + "node_modules/vite": { 3047 + "version": "5.4.3", 3048 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", 3049 + "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", 3050 + "dev": true, 3051 + "dependencies": { 3052 + "esbuild": "^0.21.3", 3053 + "postcss": "^8.4.43", 3054 + "rollup": "^4.20.0" 3055 + }, 3056 + "bin": { 3057 + "vite": "bin/vite.js" 3058 + }, 3059 + "engines": { 3060 + "node": "^18.0.0 || >=20.0.0" 3061 + }, 3062 + "funding": { 3063 + "url": "https://github.com/vitejs/vite?sponsor=1" 3064 + }, 3065 + "optionalDependencies": { 3066 + "fsevents": "~2.3.3" 3067 + }, 3068 + "peerDependencies": { 3069 + "@types/node": "^18.0.0 || >=20.0.0", 3070 + "less": "*", 3071 + "lightningcss": "^1.21.0", 3072 + "sass": "*", 3073 + "sass-embedded": "*", 3074 + "stylus": "*", 3075 + "sugarss": "*", 3076 + "terser": "^5.4.0" 3077 + }, 3078 + "peerDependenciesMeta": { 3079 + "@types/node": { 3080 + "optional": true 3081 + }, 3082 + "less": { 3083 + "optional": true 3084 + }, 3085 + "lightningcss": { 3086 + "optional": true 3087 + }, 3088 + "sass": { 3089 + "optional": true 3090 + }, 3091 + "sass-embedded": { 3092 + "optional": true 3093 + }, 3094 + "stylus": { 3095 + "optional": true 3096 + }, 3097 + "sugarss": { 3098 + "optional": true 3099 + }, 3100 + "terser": { 3101 + "optional": true 3102 + } 3103 + } 3104 + }, 3105 + "node_modules/vite-node": { 3106 + "version": "2.0.5", 3107 + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", 3108 + "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", 3109 + "dev": true, 3110 + "dependencies": { 3111 + "cac": "^6.7.14", 3112 + "debug": "^4.3.5", 3113 + "pathe": "^1.1.2", 3114 + "tinyrainbow": "^1.2.0", 3115 + "vite": "^5.0.0" 3116 + }, 3117 + "bin": { 3118 + "vite-node": "vite-node.mjs" 3119 + }, 3120 + "engines": { 3121 + "node": "^18.0.0 || >=20.0.0" 3122 + }, 3123 + "funding": { 3124 + "url": "https://opencollective.com/vitest" 3125 + } 3126 + }, 3127 + "node_modules/vitest": { 3128 + "version": "2.0.5", 3129 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", 3130 + "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", 3131 + "dev": true, 3132 + "dependencies": { 3133 + "@ampproject/remapping": "^2.3.0", 3134 + "@vitest/expect": "2.0.5", 3135 + "@vitest/pretty-format": "^2.0.5", 3136 + "@vitest/runner": "2.0.5", 3137 + "@vitest/snapshot": "2.0.5", 3138 + "@vitest/spy": "2.0.5", 3139 + "@vitest/utils": "2.0.5", 3140 + "chai": "^5.1.1", 3141 + "debug": "^4.3.5", 3142 + "execa": "^8.0.1", 3143 + "magic-string": "^0.30.10", 3144 + "pathe": "^1.1.2", 3145 + "std-env": "^3.7.0", 3146 + "tinybench": "^2.8.0", 3147 + "tinypool": "^1.0.0", 3148 + "tinyrainbow": "^1.2.0", 3149 + "vite": "^5.0.0", 3150 + "vite-node": "2.0.5", 3151 + "why-is-node-running": "^2.3.0" 3152 + }, 3153 + "bin": { 3154 + "vitest": "vitest.mjs" 3155 + }, 3156 + "engines": { 3157 + "node": "^18.0.0 || >=20.0.0" 3158 + }, 3159 + "funding": { 3160 + "url": "https://opencollective.com/vitest" 3161 + }, 3162 + "peerDependencies": { 3163 + "@edge-runtime/vm": "*", 3164 + "@types/node": "^18.0.0 || >=20.0.0", 3165 + "@vitest/browser": "2.0.5", 3166 + "@vitest/ui": "2.0.5", 3167 + "happy-dom": "*", 3168 + "jsdom": "*" 3169 + }, 3170 + "peerDependenciesMeta": { 3171 + "@edge-runtime/vm": { 3172 + "optional": true 3173 + }, 3174 + "@types/node": { 3175 + "optional": true 3176 + }, 3177 + "@vitest/browser": { 3178 + "optional": true 3179 + }, 3180 + "@vitest/ui": { 3181 + "optional": true 3182 + }, 3183 + "happy-dom": { 3184 + "optional": true 3185 + }, 3186 + "jsdom": { 3187 + "optional": true 3188 + } 3189 + } 3190 + }, 3191 + "node_modules/vitest/node_modules/magic-string": { 3192 + "version": "0.30.11", 3193 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", 3194 + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", 3195 + "dev": true, 3196 + "dependencies": { 3197 + "@jridgewell/sourcemap-codec": "^1.5.0" 3198 + } 3199 + }, 3200 + "node_modules/webidl-conversions": { 3201 + "version": "7.0.0", 3202 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 3203 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 3204 + "dev": true, 3205 + "engines": { 3206 + "node": ">=12" 3207 + } 3208 + }, 3209 + "node_modules/webpack-virtual-modules": { 3210 + "version": "0.6.2", 3211 + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", 3212 + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", 3213 + "dev": true 3214 + }, 3215 + "node_modules/whatwg-mimetype": { 3216 + "version": "3.0.0", 3217 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", 3218 + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", 3219 + "dev": true, 3220 + "engines": { 3221 + "node": ">=12" 3222 + } 3223 + }, 3224 + "node_modules/which": { 3225 + "version": "2.0.2", 3226 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3227 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3228 + "dev": true, 3229 + "dependencies": { 3230 + "isexe": "^2.0.0" 3231 + }, 3232 + "bin": { 3233 + "node-which": "bin/node-which" 3234 + }, 3235 + "engines": { 3236 + "node": ">= 8" 3237 + } 3238 + }, 3239 + "node_modules/why-is-node-running": { 3240 + "version": "2.3.0", 3241 + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 3242 + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 3243 + "dev": true, 3244 + "dependencies": { 3245 + "siginfo": "^2.0.0", 3246 + "stackback": "0.0.2" 3247 + }, 3248 + "bin": { 3249 + "why-is-node-running": "cli.js" 3250 + }, 3251 + "engines": { 3252 + "node": ">=8" 3253 + } 3254 + }, 3255 + "node_modules/wouter-preact": { 3256 + "version": "3.3.5", 3257 + "resolved": "https://registry.npmjs.org/wouter-preact/-/wouter-preact-3.3.5.tgz", 3258 + "integrity": "sha512-4IcH+UQusSrrhTl6xuUqbaL4FHbk3BocXdY6xGarSYOlv1/ZcZD45YMPW/Ef7hFI2ZGgMG3IER1UglhzAmBp/Q==", 3259 + "dependencies": { 3260 + "mitt": "^3.0.1", 3261 + "regexparam": "^3.0.0" 3262 + }, 3263 + "peerDependencies": { 3264 + "preact": "^10.0.0" 3265 + } 3266 + }, 3267 + "node_modules/ws": { 3268 + "version": "8.18.0", 3269 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 3270 + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 3271 + "engines": { 3272 + "node": ">=10.0.0" 3273 + }, 3274 + "peerDependencies": { 3275 + "bufferutil": "^4.0.1", 3276 + "utf-8-validate": ">=5.0.2" 3277 + }, 3278 + "peerDependenciesMeta": { 3279 + "bufferutil": { 3280 + "optional": true 3281 + }, 3282 + "utf-8-validate": { 3283 + "optional": true 3284 + } 3285 + } 3286 + }, 3287 + "node_modules/yallist": { 3288 + "version": "3.1.1", 3289 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3290 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3291 + "dev": true 3292 + } 3293 + } 3294 + }
+15
package.json
··· 1 + { 2 + "name": "tubes", 3 + "description": "an irc client", 4 + "authors": "leah", 5 + "version": "0.0.1", 6 + "workspaces": ["neo", "core"], 7 + "dependencies": { 8 + "@preact/signals": "1.3.0" 9 + }, 10 + "scripts": { 11 + "dev": "cd neo && npm run dev", 12 + "build": "cd neo && npm run build", 13 + "preview": "cd neo && npm run preview" 14 + } 15 + }