diff --git a/.config/example.yml b/.config/example.yml index 16fa67142e..51d380e7e7 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -35,7 +35,7 @@ port: 3000 db: host: localhost port: 5432 - + #ssl: false # Database name db: calckey @@ -48,7 +48,9 @@ db: # Extra Connection options #extra: - # ssl: true + # ssl: + # host: localhost + # rejectUnauthorized: false # ┌─────────────────────┐ #───┘ Redis configuration └───────────────────────────────────── @@ -56,10 +58,14 @@ db: redis: host: localhost port: 6379 + #tls: + # host: localhost + # rejectUnauthorized: false #family: 0 # 0=Both, 4=IPv4, 6=IPv6 #pass: example-pass #prefix: example-prefix #db: 1 + #user: default # Please configure either MeiliSearch *or* Sonic. # If both MeiliSearch and Sonic configurations are present, MeiliSearch will take precedence. diff --git a/.dockerignore b/.dockerignore index 34bbaac39b..90d15ddd90 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,8 +10,12 @@ packages/backend/.idea/vcs.xml # Node.js node_modules +**/node_modules report.*.json +# Rust +packages/backend/native-utils/target/* + # Cypress cypress/screenshots cypress/videos @@ -24,9 +28,6 @@ coverage !/.config/example.yml !/.config/docker_example.env -#docker dev config -/dev/docker-compose.yml - # misskey built db @@ -46,3 +47,4 @@ packages/backend/assets/instance.css # dockerignore custom .git Dockerfile +docker-compose.yml diff --git a/.vim/coc-settings.json b/.vim/coc-settings.json deleted file mode 100644 index 62b7b934b2..0000000000 --- a/.vim/coc-settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "eslint.packageManager": "pnpm", - "workspace.workspaceFolderCheckCwd": false -} diff --git a/CALCKEY.md b/CALCKEY.md index b44b8bbf74..5a8bbd8ff7 100644 --- a/CALCKEY.md +++ b/CALCKEY.md @@ -1,5 +1,8 @@ # All the changes to Calckey from stock Misskey +> **Warning** +> This list is incomplete. Please check the [Releases](https://codeberg.org/calckey/calckey/releases) and [Changelog](https://codeberg.org/calckey/calckey/src/branch/develop/CHANGELOG.md) for a more complete list of changes. There have been [>4000 commits (laggy link)](https://codeberg.org/calckey/calckey/compare/700a7110f7e34f314b070987aa761c451ec34efc...develop) since we forked Misskey! + ## Planned - Stucture @@ -8,31 +11,25 @@ - Rewrite backend in Rust and [Rocket](https://rocket.rs/) - Use [Magic RegExP](https://regexp.dev/) for RegEx 🦄 - Function - - User "choices" (recommended users) like Mastodon and Soapbox + - User "choices" (recommended users) and featured hashtags like Mastodon and Soapbox - Join Reason system like Mastodon/Pleroma - Option to publicize server blocks - - Build flag to remove NSFW/AI stuff - - Filter notifications by user - - Exclude self from antenna + - More antenna options + - Groups - Form - - MFM button - - Personal notes for all accounts - - Fully revamp non-logged-in screen - Lookup/details for post/file/server - [Rat mode?](https://stop.voring.me/notes/933fx97bmd) ## Work in progress -- Weblate project -- Customizable max note length - Link verification - Better Messaging UI - Better API Documentation - Remote follow button -- Admin custom CSS -- Add back time machine (jump to date) - Improve accesibility - Timeline filters +- Events +- Fully revamp non-logged-in screen ## Implemented @@ -73,7 +70,6 @@ - Raw server info only for moderators - New spinner animation - Spinner instead of "Loading..." -- SearchX instead of Google - Always signToActivityPubGet - Spacing on group items - Quotes have solid border @@ -108,10 +104,6 @@ - More antenna options - New dashboard - Backfill follower counts -- Improved emoji licensing - - This feature was ported from Misskey. - - https://github.com/misskey-dev/misskey/commit/8ae9d2eaa8b0842671558370f787902e94b7f5a3: enhance: カスタム絵文字にライセンス情報を付与できるように - - https://github.com/misskey-dev/misskey/commit/ed51209172441927d24339f0759a5badbee3c9b6: 絵文字のライセンスを表示できるように - Compile time compression - Sonic search - Popular color schemes, including Nord, Gruvbox, and Catppuccin @@ -125,10 +117,14 @@ - Focus trapping and button labels - Meilisearch with filters - Post editing +- Display remaining time on rate-limits +- Proper 2FA input dialog +- Let moderators see moderation nodes +- Non-mangled unicode emojis + - Skin tone selection support ## Implemented (remote) - - MissV: [fix Misskey Forkbomb](https://code.vtopia.live/Vtopia/MissV/commit/40b23c070bd4adbb3188c73546c6c625138fb3c1) - [Make showing ads optional](https://github.com/misskey-dev/misskey/pull/8996) - [Tapping avatar in mobile opens account modal](https://github.com/misskey-dev/misskey/pull/9056) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f1f76bf54..988156a72d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,284 +2,580 @@ All changes from v13.0.0 onwards, for a full list of differences read CALCKEY.md -## [14.0.0-rc2] - 2023-06-06 +## [14.0.0-rc3] - 2023-06-24 ### Bug Fixes -- Fix deck view margins +- Fix: improv ux of deck scroll -- Fix: Parse mastoAPI `limit` argument in more places & Improve converting arguments to boolean ([#9716](https://github.com/orhun/git-cliff/issues/9716)) +- Fix: editing caption accuracy -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9716 -Authored-by: fruye <fruye@unix.dog> -Signed-off-by: Cleo John <waterdev@galaxycrow.de> -Co-authored-by: fruye <fruye@unix.dog> -Co-committed-by: fruye <fruye@unix.dog> +- Fix: only show meili in metrics if available -- Fix: send button +- Fix server metric iteration -- Fix: intermediarily convert ids +- Fix inbox stall -- Fix: mobile button alignment +- Fixes #10284, fixes #10208; passing in all pugVariables needed in base.pug, fixes csp -- Fix: when count is actually 0 +- Fix: unread message bgcolor -- Fix cli more +- Fix boost mutes -- Fix: don't show smartphone UI when settings icon is double-clicked +- Fix search features -- Fix: unicode aliases +- Fix: :bug: properly enter date -- Fix: repo url +- Fix back button display -- Fix: :bug: can't send blank messages +- Fix: "24"th hour doesn't exist, it's 0 -Closes #9661 +- Fix: :adhesive_bandage: YYYYMMDD with dashes -- Fix: make sure cw button is on new line +- Fix: :rotating_light: fix unused import -- Fix: local time for users +- Fix: :adhesive_bandage: day isn't decreased by 1 -- Fix: max user profile length to db field length +- Fix: 🚸 make "show replies in timeline" work as expected -Resolves: #9749 +Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> -- Fix: :bug: no nyaizing undefined text +- Fix: :ambulance: fix stream.ts -Closes #9752 +- Fix: :bug: sonic logged connection despite not existing -- Fix: a bug in ads +- Fix: :ambulance: fix switch import -- Fix color in follow button +- Fix: :lipstick: fix sign-in 2fa token style -- Fix: relay signature handling +- Fix: :bug: 2FA dialog -A change sometime ago moved to setting some signature fields in the incoming -object to undefined as opposed to deleting them. The trouble is that downstream -code checks against existence, not undefinedness and rejects the message. +- Fix: :bug: use correct 2fa value -Resolves: #9665 +- Fix: :adhesive_bandage: convert numeric input to string -- Fix +- Fix aode-relay compatibility -- Fix +- Fix: :bug: display punishments on desktop -- Fix callback url +- Fix user preview menu color -- Fix japanese locale +- Fix: :lipstick: white foreground on forced black background -- Fix? +Remedies the problem introduced by 020c4f578827e2391b35cd102ee197cc037c0382 causing black text to appear over a black-ish background -- Fix: allow announces with followers visibility +- Fix: :globe_with_meridians: correct "clear" -- Fix: :bug: formlink -> button +- Fix: 🐛 don't allow editing a post on another account -fixes notifications and drive in settings +- Fix: 🐛 when editing polls, keep votes for unmodified choices -- Fix sounds settings +- Fix: :bug: properly index edited post -- Fix doc link +- Fix: :adhesive_bandage: duplicate update -- Fix: direct boost ([#9783](https://github.com/orhun/git-cliff/issues/9783)) +- Fix: :lipstick: badge style on mobile -Sorry to create PR multiple times. I should have included this in #9778. +- Fix UI sometimes being offset on mobile + +- Fix: 🐛 empty fs stat + +- Fix build and clean scripts + +- Fix: :bug: only collapsed reply if notification is reply + +- Fix: 🐛 proper isDuplicateKeyValueError handling + +Closes #10340 +Co-authored-by: Kainoa Kanter <kainoa@t1c.dev> + +- Fix: :bug: collapse reply if type is a mention and it has a reply + +- Fix: :pencil2: typo in API docs + errors Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9783 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> -- Fix: don't nyaize quoted text +- Fix: hide tooltip on page change -- Fix: don't nyaize quoted text ([#9791](https://github.com/orhun/git-cliff/issues/9791)) +- Fix: don't use cache on autocomplete for now -- Fix search import +- Fix: :lipstick: consistent emoji styling -- Fix migration +- Fix: :adhesive_bandage: disable Unicode 15 emojis -- Fix: :bug: make recently used group +https://github.com/jdecked/twemoji/pull/43 -Closes #9784 +- Fix: :bug: pull up instance window instead of search field -- Fix: add cargo to DOCKERFILE +- Fix: autocomplete not being focused properly -- Fix #9784 +- Fix: mobile note spacing -- Fix help button alignment iconsOnly +- Fix: 🐛 race condition between workers when creating note -- Fix indexing description +Closes #10345 +Discovered here: https://codeberg.org/calckey/calckey/issues/10345#issuecomment-950475 -- Fix: :passport_control: no longer need 2fa for webauthn +- Fix: :bug: non-duplicate skin tone selection -- Fix import +- Fix: :ambulance: disable lightningcss transformer for now -- Fix button alignments +- Fix: :arrow_down: downgrade chalk -- Fix: dialogs not coming up +- Fix: :bug: start transaction with multi -- Fix: dockerfile +- Fix: :bug: remove cw in post edit -- Fix: add copy for build from native-utils +Closes #10353 -- Fix: changing passwords, 2fa, and password resets. +- Fix: :construction_worker: fix format run -The argon2 usage was only implemented for sign-ins which broke a bunch of other -endpoints and features. +- Fix compile error -- Fix: buttons not showing +- Fix: jump to top of page when opening modals -- Fix: :bug: go to last timeline selected +I want to do this probably later, for now it will still focus inside the window when pressing tab -- Fix: toggling the blocking state from the instance-info admin view ([#9809](https://github.com/orhun/git-cliff/issues/9809)) +- Fix: :alembic: ensure splash is removed upon load -Because the admin meta information was never loaded on this page, no amount of toggling the block or suspend sliders on the instance-info page (e.g. `https://calckey.example.com/instance-info/instance.tld`) will result in the instance actually being added to the blocklist. You could still do it from the bulk blocklist management page, but that can get unwieldy quickly if you just want to do a quick block of an instance. +https://codeberg.org/calckey/calckey/pulls/10285#issuecomment-951231 -Co-authored-by: amy bones <amy@spookygirl.boo> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9809 -Co-authored-by: amybones <amybones@noreply.codeberg.org> -Co-committed-by: amybones <amybones@noreply.codeberg.org> +- Fix: focus first element inside modal -- Fix +- Fix: :adhesive_bandage: make cacheRemoteFiles false by default for new instances -- Fix(client): userpage ui ([#9179](https://github.com/orhun/git-cliff/issues/9179)) +- Fix: basically just undo my previous modal changes -* fix(unverified): clip pages ui -* fix(unverified): user page width +### Documentation -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> +- Docs: 📝 tips -- Fix id of move activity +- Docs: 📝 changelog -- Fix move inbox +- Docs: :memo: rudamentary sea-orm-cli instructions -- Fix: format script; chore: format +- Docs: :memo: sea orm migration "Setting Up Migration" doc link -- Fix: typo +- Docs: 📝 fix formatting -- Fix +- Docs: :memo: min rust ver -- Fix chat metadata +- Docs: :memo: changelog -- Fix lookup instance +- Docs: :memo: update links -- Fix: :lock: don't show notes with CW on welcome screen +- Docs: :memo: changelog -Closes #9849 +- Docs: :memo: API documentation generation -- Prevent crashes due to timezone === null +- Docs: :memo: add symlink for api docs in docs/ -- Fix a bug +- Docs: 📝 use document instead of symlink -- Fix: disable "Search" keyword ([#9856](https://github.com/orhun/git-cliff/issues/9856)) +- Docs: :memo: document packages dir -Related: #9816 #9830 -I was so careless that I didn't know "Search" was also a keyword. I disabled that and fixed a minor bug. +- Docs: :memo: clearer package docs -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9856 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> +- Docs: :memo: mention libvips requirement -- Fix +#10352 -- Fix tag on explore -- Fix header tabs +### Features -- Fix: ドライブアップロードで413が返ってきたときにエラーメッセージを表示 ([#10680](https://github.com/orhun/git-cliff/issues/10680)) +- Feat: ✨ searchFilters meta property -- Fix: boost muting in the recommended timeline ([#9906](https://github.com/orhun/git-cliff/issues/9906)) +- Feat: ✨ patron labels -Closes: #9905 -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9906 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> +- Feat: channel column in deck view -- Fix an instance ticker bug +- Feat: :sparkles: delay function in animated MFM -- Fix: add route +- Feat: :monocle_face: bring back misskey's moderation displays on profile -- Fix? +- Feat: 🔒 Improve 2FA/keypass experience -- Fix: style email with inline styles +Co-authored-by: Tamania <tamaina@hotmail.co.jp> +Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> -- Fix disabled, formatting +- Feat: :lipstick: button icons for security -- Fix: Make statusModel `created_at` fields be ISO 8601 strings +- Feat: :sparkles: 2FA input dialog -This makes the 'Reactions to this post' status (seen when viewing -a status context) send the correct data type for `created_at` fields. +- Add comments -https://docs.joinmastodon.org/entities/Account/#created_at -https://docs.joinmastodon.org/entities/Status/#created_at +- Add faded edges to swiper + shadows :3 -- Fix: Get list titles from Form data when creating and updating lists +- Add refresh button to poll -This change will actually make it possible for Mastodon clients to -create and rename lists, as they send the title in a Form data instead -of a query string. +- Add environment variable -https://docs.joinmastodon.org/methods/lists/#form-data-parameters +- Feat: :sparkles: display remaining time on ratelimits -- Fix: Declare /api/v1/accounts/relationships before /api/v1/accounts/:id +- Feat: :sparkles: $[small ] and $[center ] MFM syntax -Previously the 'relationships' part was considered to be an account id -and was handled by completely different API endpoint. +- Feat: :sparkles: clickable domains on job queue -- Fixes +https://post.naskya.net/notes/9gbfos2mv5iz6g63 -- Fixes? +- Feat: :sparkles: emoji skin tone -- Fix subnote +Closes #9959 -- Fix +- Feat: :sparkles: skin tone selector in category -- Fix: centering block math ([#9946](https://github.com/orhun/git-cliff/issues/9946)) +- Feat: :lock: expand /api/v1/instance/peers to proper endpoint and check for private mode -Similar to `inlineCode` and `blockCode`, MFM provides two types of formula syntax, `mathInline` and `mathBlock` (I'm curious why these aren't called `inlineMath`/`blockMath`, but oh well) +Closes #10358 -Other platforms, like GitHub, **Math**todon, my blog, etc., also support these two types of formula representation, and math blocks are centered on (maybe) all such platforms. - +### Miscellaneous Tasks -But Calckey (Misskey v12) don't center math blocks. I'd say this is a bug, and this makes `blockMath` useless (it's just `inlineMath` in a new line). +- Chore: update patrons - +- Chore: lint sw -So I fixed this. +- Chore: update patrons - +- Chore: update patrons -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9946 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> +- Chore: Translated using Weblate (Catalan) -- BlockMath is not necessarily multi-line (is this copy-pasted from blockCode?) +Currently translated at 100.0% (1770 of 1770 strings) -- Fix poll voting causing edit revisions. +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ -- Fix(ap): Use unique identifier for each follow request +- Chore: Translated using Weblate (Japanese) -Closes #9677 +Currently translated at 100.0% (1770 of 1770 strings) -Co-authored-by: GitHub <hutchisr> +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ -- Fix meta fetch +- Chore: Merge branch 'origin/develop' into Weblate. -- Fix params +- Chore: formatting -- Fix email validation +- Chore: update patrons -- Fix: Commit CI not running because cargo is not installed +- Chore: Translated using Weblate (Catalan) -- Fix: Switch to node alpine image +Currently translated at 100.0% (1772 of 1772 strings) -- Fix db migration +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ -- Fix lang +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Update cheat sheet with delay + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1777 of 1777 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Polish) + +Currently translated at 96.4% (1714 of 1777 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Translated using Weblate (Italian) + +Currently translated at 71.0% (1262 of 1777 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/it/ + +- Chore: formatting + +- Chore: formatting + +- Chore: format + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1787 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 97.4% (1741 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 97.4% (1741 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: formatting + +- Chore: :passport_control: improve gitea templates + +- Chore: :passport_control: conventional commits in body, not checkbox + +- Chore: :arrow_up: up pnpm + +- Chore: Added translation using Weblate (Portuguese (Brazil)) + +- Chore: Translated using Weblate (German) + +Currently translated at 98.6% (1762 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (Portuguese (Brazil)) + +Currently translated at 0.6% (12 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pt_BR/ + +- Chore: :art: format + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1787 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Translated using Weblate (Chinese (Traditional)) + +Currently translated at 95.6% (1709 of 1787 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1803 of 1803 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Portuguese (Brazil)) + +Currently translated at 4.4% (81 of 1803 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pt_BR/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1804 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Polish) + +Currently translated at 95.1% (1716 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1804 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 99.2% (1791 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Update to node 20 + +- Chore: format + +- Chore: Translated using Weblate (Italian) + +Currently translated at 69.9% (1262 of 1804 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/it/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: :art: format + +- Chore: :bookmark: dev52 + +- Chore: :art: format + +- Chore: update bug report template + +- Chore: :memo: links in bug template + +- Chore: :memo: bring bug template changes to feature template + +- Chore: :memo: deployment method in bug report + +- Chore: :memo: fix duplicate, add emojis + +- Chore: :memo: add emojis to issue templates + +Because everything's better with emojis! + +- Chore: :memo: emojis in issue label + +- Chore: :art: format + +- Chore: :memo: too many emojis + +- Chore: :coffin: remove vim settings + +- Chore: :arrow_up: up emojilib + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1805 of 1805 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + + +### Performance + +- Perf: limit number of antennas + +- Perf: set patrons in redis + +- Perf: use charts data for stats endpoint + +- Perf: ⚡ update emojis, cache in IndexedDb + +Closes #9959 +May fix #9724 + +- Perf: ⚡ use setInterval instead of setTimeout chain in MkTime + + +### Refactor + +- Refactor: client assets + +- Refactor: client assets + +- Refactor: :coffin: remove old db calls, add todo + +- Refactor: :recycle: import from @/db + +- Refactor: 💄 reverse pie chart color on indexing + +Co-authored-by: PrivateGER <privateger@codeberg.org> + +- Refactor: :recycle: use parent/child selector for attachment + +- Refactor: :lipstick: style punishments + +- Refactor: :arrow_up: use custom version of vue3-otp-input + +This enables the use of number inputs without the slider + +- Refactor: :safety_vest: replace js-yaml with yaml + +Technically mitigates CVE-2023-2251, but users never input YAML to Calckey. Still, this does no harm, and it's a good idea to keep dependencies like these up-to-date, as js-yaml was last updated 2 years ago. + +- Refactor: :coffin: unused import + +- Refactor: :art: locale loader + +- Refactor: :recycle: better edited timestamp display + +- Refactor: :recycle: reorganize note menu + +translate just above view remote + +- Refactor: ♻️ open instance as lookup window + +- Refactor: :pushpin: use own emoji descriptions + +- Refactor: :recycle: refactor MkModalWindow for TS safety + +- Refactor: :recycle: simplify null check + +- Refactor: :recycle: make skin tones modular + +Could possibly be for future custom emoji sets that support custom skin tones? (i.e. Mutant Standard) + +- Refactor: :recycle: url preview + +- Refactor: :label: add antenna type to streaming types + + +### Styling + +- Style: 💄 full follow button for userinfo in userlist + +- Style: :lipstick: margin on user card follow btn + +- Style: :lipstick: 2fa dialog styling + + +## [14.0.0-rc2c] - 2023-06-06 + +### Bug Fixes + +- Fix: post editing meta + + +### Miscellaneous Tasks + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1753 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + + +## [14.0.0-rc2b] - 2023-06-06 + +## [14.0.0-rc2a] - 2023-06-06 + +### Bug Fixes + +- Fix cw button pos... oops + + +### Miscellaneous Tasks + +- Update cargo.lock + + +## [14.0.0-rc2] - 2023-06-06 + +### Bug Fixes - Fix translation box @@ -500,26 +796,6 @@ https://calckey.aokaga.work/notes/9f6ksv2oov ### Documentation -- Docs: changes - -- Docs: 📝 sonic instructions - -- Docs: 📝 sonic - -- Docs: sonic - -- Docs: add note about reverse migration - -- Docs: hyperlink foundkey commits - -- Docs: hyperlink foundkey commits - -- Docs: rm yunohost - -has been broken for months, I don't maintain it either. - -- Docs - - Docs: links - Docs: 📝 pm2 logrotate @@ -553,215 +829,6 @@ has been broken for months, I don't maintain it either. ### Features -- Feat: Make follower counts for remote users correct ([#9705](https://github.com/orhun/git-cliff/issues/9705)) - -#9293 - -Not sure if this is the right approach for this - -Co-authored-by: s1idewhist1e <trombonedude05@gmail.com> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9705 -Co-authored-by: s1idewhist1e <s1idewhist1e@noreply.codeberg.org> -Co-committed-by: s1idewhist1e <s1idewhist1e@noreply.codeberg.org> - -- Add 404 as replacements - -- Feat: set license information for custom emojis ([#9719](https://github.com/orhun/git-cliff/issues/9719)) - -Closes: #9711 (please check this issue first) - -I cherry-picked two commits ([1](https://github.com/misskey-dev/misskey/commit/8ae9d2eaa8b0842671558370f787902e94b7f5a3), [2](https://github.com/misskey-dev/misskey/commit/ed51209172441927d24339f0759a5badbee3c9b6)) from [Misskey](https://github.com/misskey-dev/misskey) and made a few changes. -「ライセンス」should be written as "License" in the following screenshots, but it has not yet been translated. - -It would be nice if we could include multiple lines of text, but I just ported what's been implemented so far in Misskey not to mess things up. - -This is my first pull request (aside from typo correction). Feel free to point out any issues! - - - - - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9719 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: compile time compression - -- Feat: spruce up CLI - -- Feat: :sparkles: more themes! - -- Feat: swap home timeline with social's functionality ([#9597](https://github.com/orhun/git-cliff/issues/9597)) - -The Home timeline functionality is swapped with social's. Meaning that Home timeline now consists of followee's and local posts. Social from now on will contain only followee's posts. See more info in the attached ticket. - -Some changes applied in english locales as well. Probably the rest of the languages need to be fixed though. - -This PR closes the ticket: https://codeberg.org/calckey/calckey/issues/9552 - -Co-authored-by: yawhn <kordaris@gmail.com> -Co-authored-by: ThatOneCalculator <kainoa@t1c.dev> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9597 -Co-authored-by: yawhn <yawhn@noreply.codeberg.org> -Co-committed-by: yawhn <yawhn@noreply.codeberg.org> - -- Feat: add sonic to docker - -- Feat: masto api add display name - -- Feat: :sparkles: post metadata uses full @ - -Closes #9660 - -- Feat: new chat button on mobile - -- Feat: experimental post import - -- Add info - -- Feat: :sparkles: button in admin dash to index posts - -- Feat: custom KaTeX macro ([#9779](https://github.com/orhun/git-cliff/issues/9779)) - -Closes: #9759 -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9779 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Add rust to docker - -- Feat: :lock: add argon2 support - -Passwords will be automatically re-hashed on sign-in. All new password hashes will be argon2 by default. This uses argon2id and is not configurable. In the very unlikely case someone has more specific needs, a fork is recommended. ChangeLog: Added Co-authored-by: Chloe Kudryavtsev <code@toast.bunkerlabs.net> - -Breaks Calckey -> Misskey migration, but fixes Foundkey -> Calckey migration - -- Add argon - -- Feat: add option to boost with Home and Followers-only visibility ([#9788](https://github.com/orhun/git-cliff/issues/9788)) - -Closes: #9777 - -This pull request includes UI changes (please check the attached images). - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9788 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: :sparkles: search now searches posts and users - -- Feat: :sparkles: help menu in navbar - -- Add top margin to help button - -- Add VIPS to dockerfile - -- Add "speak as cat" setting to ja-jp - -- Feat: :sparkles: push notifs button - -Co-authored-by: Tamania <tamaina@hotmail.co.jp> - -- Feat: give reason for soft mutes - -Bad UX when a post is muted and it just says "Some chick said something". Now -provide some context too to help people decide if they want to view something -potentially triggering. - -- Feat: blur muted text - -- Feat: add hidden hashtags management page - -This simply adds a basic admin UI to blocklist some hashtags from displaying in -the trending widget. The facility existed already in the backend, but there was -no UI to manipulate the list save for executing raw SQL or API calls. - -- Feat: per-user boost muting ([#9825](https://github.com/orhun/git-cliff/issues/9825)) - -Cherry-picked from FoundKey/c414f24a2c ([commit](https://akkoma.dev/FoundKeyGang/FoundKey/commit/c414f24a2c123774246c7eca65edda4d3afaf8b3)) - -This allows us to hide specified users' boosts from the timelines (the boosts will still be visible on their user page). - -Co-authored-by: Hélène <pleroma-dev@helene.moe> -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9825 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: messaging room banner - -- Feat: mark all as read action in chat - -- Feat: admin lookup files/instance - -- Feat: index posts action - -- Feat: lookup post action - -- Feat: rename workspaces - -- Feat: :sparkles: software name on hover icon in instance ticker - -- Feat: add an option to disable emoji reactions ([#9878](https://github.com/orhun/git-cliff/issues/9878)) - -Closes: #9865 -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9878 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: make it toggleable whether to disable emojis in notifications ([#9880](https://github.com/orhun/git-cliff/issues/9880)) - -I talked about feature #9865 on my fedi account and received a comment like, "I don't care about emoji reactions in my timelines, but I do care what reactions I get!" - -Adding too many options is bad, but I agreed that making it toggleable whether to disable emojis in notifications is helpful, so I added this feature. This allows you to check emoji reactions to your posts in notifications while using the simple UI. I'd say this provides an experience that neither Mastodon nor Misskey has. - -The new setting item shows up only when you disable emoji reactions. - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9880 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Feat: Implement reading Announcements from MastoAPI - -- Feat: heatmap option for activity widget - -- Feat: reserved usernames ([#9917](https://github.com/orhun/git-cliff/issues/9917)) - -This PR adds a feature to prevent users from creating a new account with a reserved username such as root, admin, system, proxy, info, etc... - -Reserved usernames can be configured via the config file. - -The administrator can create an account with a reserved username via the first setup screen or the control panel. - -The existing account of reserved usernames will not be affected. - -Co-authored-by: Namekuji <nmkj@mx.kazuno.co> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9917 -Co-authored-by: Namekuji <nmkj@noreply.codeberg.org> -Co-committed-by: Namekuji <nmkj@noreply.codeberg.org> - -- Feat: :sparkles: frontend interface for post-account creation email verification - -- Add kaiteki to example proxyBypassHosts - -- Add additional information & show more button in user preview popup - -- Add the focus trap thingies again - -- Add toggler - -- Add blockMath - -- Add silenced colour - -- Add db migration - - Add catppuccin latte - Add migration patches and fix commands @@ -894,401 +961,6 @@ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> ### Miscellaneous Tasks -- Chore: update megalodon - -- Chore: update package locks - -- Chore: bump pnpm version - -- Chore: add emoji aliases - -- Chore: :package: upgrade megalodon - -- Chore: update patron list - -- Chore: update patrons - -- Chore: bump pnpm - -- Update post job - -- Chore: :globe_with_meridians: locale changes - -Closes #9781 #9773 - -- Chore: :globe_with_meridians: locale changes - -Closes #9781 #9773 - -- Chore: update patron list - -- Chore: up pnpm - -- Chore: add cleanup migration - -- Chore: :art: format - -- Chore: remove okteto - -- Chore: update Japanese locale ([#9802](https://github.com/orhun/git-cliff/issues/9802)) - -- Chore: update patrons - -- Chore: pnpm 8.1.1 - -- Chore: back button in control panel - -- Chore: back button in more places - -- Chore: rome formatting - -- Chore: formatting - -- Chore: up pnpm - -- Chore: formatting - -- Chore: update mfm-js version ([#9844](https://github.com/orhun/git-cliff/issues/9844)) - -This resolves #9757. - -Co-authored-by: naskya <m@naskya.net> -Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9844 -Co-authored-by: naskya <naskya@noreply.codeberg.org> -Co-committed-by: naskya <naskya@noreply.codeberg.org> - -- Chore: up swc - -- Update locale - -- Chore: formatting - -- Chore: add weblate config file - -- Chore: Translated using Weblate (Polish) - -Currently translated at 99.7% (1720 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: formatting - -- Update locales for calckey - -- Chore: Translated using Weblate (Greek) - -Currently translated at 31.6% (545 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Translated using Weblate (English) - -Currently translated at 100.0% (1724 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ - -- Chore: Translated using Weblate (Spanish) - -Currently translated at 92.0% (1587 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ - -- Chore: Translated using Weblate (Polish) - -Currently translated at 100.0% (1724 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 90.1% (1554 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Greek) - -Currently translated at 33.2% (574 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Translated using Weblate (Spanish) - -Currently translated at 92.0% (1587 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ - -- Chore: Translated using Weblate (Greek) - -Currently translated at 41.4% (714 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Translated using Weblate (Greek) - -Currently translated at 43.2% (745 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Translated using Weblate (Spanish) - -Currently translated at 92.5% (1595 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 93.6% (1615 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Greek) - -Currently translated at 43.2% (745 of 1724 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: formatting - -- Chore: update summaly - -- Chore: Translated using Weblate (Japanese) - -Currently translated at 100.0% (1726 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ - -- Chore: Translated using Weblate (Polish) - -Currently translated at 100.0% (1726 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 95.0% (1640 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 95.2% (1644 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 100.0% (1726 of 1726 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: formatting - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: Translated using Weblate (English) - -Currently translated at 100.0% (1727 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 99.8% (1724 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: up pakcages - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 22.9% (396 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: Translated using Weblate (German) - -Currently translated at 94.6% (1634 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ - -- Chore: Translated using Weblate (German) - -Currently translated at 94.6% (1634 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ - -- Chore: Translated using Weblate (Spanish) - -Currently translated at 92.2% (1594 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ - -- Chore: Translated using Weblate (French) - -Currently translated at 95.6% (1652 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fr/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 100.0% (1727 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Chinese (Traditional)) - -Currently translated at 97.2% (1680 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ - -- Chore: formatting - -- Chore: more rpine for server activity widget - -- Chore: update examples - -- Update patrons - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 35.0% (606 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: Translated using Weblate (Russian) - -Currently translated at 100.0% (1727 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ - -- Chore: Translated using Weblate (Chinese (Traditional)) - -Currently translated at 97.4% (1683 of 1727 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: update icons on post form - -- Chore: Added translation using Weblate (Finnish) - -- Chore: Translated using Weblate (Finnish) - -Currently translated at 2.4% (43 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ - -- Chore: upgrade megalodon - -- Chore: Translated using Weblate (English) - -Currently translated at 100.0% (1735 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 37.1% (644 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: Translated using Weblate (Finnish) - -Currently translated at 11.7% (204 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ - -- Chore: Translated using Weblate (Finnish) - -Currently translated at 11.7% (204 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ - -- Chore: Translated using Weblate (Japanese) - -Currently translated at 99.3% (1724 of 1735 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ - -- Chore: Merge branch 'origin/develop' into Weblate. - -- Chore: up browser-image-resizer - -- Chore: format - -- Chore: theme refactor - -- Update patrons - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 69.2% (1204 of 1739 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: patrons - -- Chore: formatting - -- Chore: Translated using Weblate (Catalan) - -Currently translated at 100.0% (1739 of 1739 strings) - -Translation: Calckey/locales -Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ - -- Chore: Merge branch 'origin/develop' into Weblate. - - Updates to include alt text editing - Update file sensitivity on note edit @@ -1966,12 +1638,117 @@ Translate-URL: https://hosted.weblate.org/projects/calckey/locales/nl/ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> +- Chore: Translated using Weblate (English) + +Currently translated at 100.0% (1753 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 98.8% (1732 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Translated using Weblate (Dutch) + +Currently translated at 32.2% (566 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/nl/ + +- Chore: Translated using Weblate (Dutch) + +Currently translated at 32.3% (567 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/nl/ + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1753 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 97.6% (1711 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.1% (1720 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.1% (1720 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.1% (1720 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.1% (1720 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (Dutch) + +Currently translated at 34.2% (601 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/nl/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + - Chore: formatting - Chore: :arrow_up: up pnpm - Chore: :bulb: meili +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + - Chore: format - Chore: format @@ -1984,8 +1761,29 @@ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> - Chore: :arrow_up: up bull +- Chore: Translated using Weblate (Danish) + +Currently translated at 11.5% (203 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/da/ + - Chore: formatting +- Chore: Translated using Weblate (German) + +Currently translated at 98.9% (1734 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 99.5% (1745 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + - Chore: formatting - Chore: update example config @@ -1996,6 +1794,13 @@ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> - Chore: :arrow_up: up various deps +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1753 of 1753 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + - Chore: format - Chore: formatting @@ -2016,12 +1821,6 @@ Co-authored-by: Syuilo <syuilotan@yahoo.co.jp> ### Refactor -- Refactor: nyaize on the frontend - -- Refactor - -- Refactor: change import type to radio - - Refactor: remove internal apps page - Enhance: emoji width and height @@ -2043,11 +1842,1076 @@ Correct og:type for users, format docs, deprecate _info_card_ ### Styling -- Style +- Style: 💄 server metrics widgets + + +## [14.0.0-rc] - 2023-05-02 + +### Bug Fixes + +- BlockMath is not necessarily multi-line (is this copy-pasted from blockCode?) + +- Fix poll voting causing edit revisions. + +- Fix(ap): Use unique identifier for each follow request + +Closes #9677 + +Co-authored-by: GitHub <hutchisr> + +- Fix meta fetch + +- Fix params + +- Fix email validation + +- Fix: Commit CI not running because cargo is not installed + +- Fix: Switch to node alpine image + +- Fix db migration + +- Fix lang + +- Fix show more import + + +### Features + +- Add toggler + +- Add blockMath + +- Add silenced colour + +- Add db migration + + +### Miscellaneous Tasks + +- Chore: Translated using Weblate (English) + +Currently translated at 100.0% (1735 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 37.1% (644 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Finnish) + +Currently translated at 11.7% (204 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ + +- Chore: Translated using Weblate (Finnish) + +Currently translated at 11.7% (204 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 99.3% (1724 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: up browser-image-resizer + +- Chore: format + +- Chore: theme refactor + +- Update patrons + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 69.2% (1204 of 1739 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: patrons + +- Chore: formatting + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 100.0% (1739 of 1739 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Merge branch 'origin/develop' into Weblate. + + +## [13.2.0-beta9h] - 2023-04-30 + +## [13.2.0-beta9] - 2023-04-29 + +### Bug Fixes + +- Fix: add route + +- Fix? + +- Fix: style email with inline styles + +- Fix disabled, formatting + +- Fix: Make statusModel `created_at` fields be ISO 8601 strings + +This makes the 'Reactions to this post' status (seen when viewing +a status context) send the correct data type for `created_at` fields. + +https://docs.joinmastodon.org/entities/Account/#created_at +https://docs.joinmastodon.org/entities/Status/#created_at + +- Fix: Get list titles from Form data when creating and updating lists + +This change will actually make it possible for Mastodon clients to +create and rename lists, as they send the title in a Form data instead +of a query string. + +https://docs.joinmastodon.org/methods/lists/#form-data-parameters + +- Fix: Declare /api/v1/accounts/relationships before /api/v1/accounts/:id + +Previously the 'relationships' part was considered to be an account id +and was handled by completely different API endpoint. + +- Fixes + +- Fixes? + +- Fix subnote + +- Fix + +- Fix: centering block math ([#9946](https://github.com/orhun/git-cliff/issues/9946)) + +Similar to `inlineCode` and `blockCode`, MFM provides two types of formula syntax, `mathInline` and `mathBlock` (I'm curious why these aren't called `inlineMath`/`blockMath`, but oh well) + +Other platforms, like GitHub, **Math**todon, my blog, etc., also support these two types of formula representation, and math blocks are centered on (maybe) all such platforms. + + + +But Calckey (Misskey v12) don't center math blocks. I'd say this is a bug, and this makes `blockMath` useless (it's just `inlineMath` in a new line). + + + +So I fixed this. + + + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9946 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + + +### Documentation + +- Docs + + +### Features + +- Feat: :sparkles: frontend interface for post-account creation email verification + +- Add kaiteki to example proxyBypassHosts + +- Add additional information & show more button in user preview popup + +- Add the focus trap thingies again + + +### Miscellaneous Tasks + +- Chore: more rpine for server activity widget + +- Chore: update examples + +- Update patrons + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 35.0% (606 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 100.0% (1727 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Chinese (Traditional)) + +Currently translated at 97.4% (1683 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: update icons on post form + +- Chore: Added translation using Weblate (Finnish) + +- Chore: Translated using Weblate (Finnish) + +Currently translated at 2.4% (43 of 1735 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ + +- Chore: upgrade megalodon + + +### Refactor + +- Refactor: change import type to radio + + +## [13.2.0-beta8] - 2023-04-26 + +### Bug Fixes + +- Fix an instance ticker bug + + +### Features + +- Feat: heatmap option for activity widget + +- Feat: reserved usernames ([#9917](https://github.com/orhun/git-cliff/issues/9917)) + +This PR adds a feature to prevent users from creating a new account with a reserved username such as root, admin, system, proxy, info, etc... + +Reserved usernames can be configured via the config file. + +The administrator can create an account with a reserved username via the first setup screen or the control panel. + +The existing account of reserved usernames will not be affected. + +Co-authored-by: Namekuji <nmkj@mx.kazuno.co> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9917 +Co-authored-by: Namekuji <nmkj@noreply.codeberg.org> +Co-committed-by: Namekuji <nmkj@noreply.codeberg.org> + + +### Miscellaneous Tasks + +- Chore: Translated using Weblate (Catalan) + +Currently translated at 22.9% (396 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ + +- Chore: Translated using Weblate (German) + +Currently translated at 94.6% (1634 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (German) + +Currently translated at 94.6% (1634 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 92.2% (1594 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ + +- Chore: Translated using Weblate (French) + +Currently translated at 95.6% (1652 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fr/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 100.0% (1727 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Chinese (Traditional)) + +Currently translated at 97.2% (1680 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ + +- Chore: formatting + + +## [13.2.0-beta7] - 2023-04-25 + +### Bug Fixes + +- Fix: :lock: don't show notes with CW on welcome screen + +Closes #9849 + +- Prevent crashes due to timezone === null + +- Fix a bug + +- Fix: disable "Search" keyword ([#9856](https://github.com/orhun/git-cliff/issues/9856)) + +Related: #9816 #9830 +I was so careless that I didn't know "Search" was also a keyword. I disabled that and fixed a minor bug. + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9856 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Fix + +- Fix tag on explore + +- Fix header tabs + +- Fix: ドライブアップロードで413が返ってきたときにエラーメッセージを表示 ([#10680](https://github.com/orhun/git-cliff/issues/10680)) + +- Fix: boost muting in the recommended timeline ([#9906](https://github.com/orhun/git-cliff/issues/9906)) + +Closes: #9905 +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9906 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + + +### Documentation + +- Docs: rm yunohost + +has been broken for months, I don't maintain it either. + + +### Features + +- Feat: rename workspaces + +- Feat: :sparkles: software name on hover icon in instance ticker + +- Feat: add an option to disable emoji reactions ([#9878](https://github.com/orhun/git-cliff/issues/9878)) + +Closes: #9865 +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9878 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: make it toggleable whether to disable emojis in notifications ([#9880](https://github.com/orhun/git-cliff/issues/9880)) + +I talked about feature #9865 on my fedi account and received a comment like, "I don't care about emoji reactions in my timelines, but I do care what reactions I get!" + +Adding too many options is bad, but I agreed that making it toggleable whether to disable emojis in notifications is helpful, so I added this feature. This allows you to check emoji reactions to your posts in notifications while using the simple UI. I'd say this provides an experience that neither Mastodon nor Misskey has. + +The new setting item shows up only when you disable emoji reactions. + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9880 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: Implement reading Announcements from MastoAPI + + +### Miscellaneous Tasks + +- Chore: up swc + +- Update locale + +- Chore: formatting + +- Chore: add weblate config file + +- Chore: Translated using Weblate (Polish) + +Currently translated at 99.7% (1720 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Update locales for calckey + +- Chore: Translated using Weblate (Greek) + +Currently translated at 31.6% (545 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Translated using Weblate (English) + +Currently translated at 100.0% (1724 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 92.0% (1587 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ + +- Chore: Translated using Weblate (Polish) + +Currently translated at 100.0% (1724 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 90.1% (1554 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Greek) + +Currently translated at 33.2% (574 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 92.0% (1587 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ + +- Chore: Translated using Weblate (Greek) + +Currently translated at 41.4% (714 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Translated using Weblate (Greek) + +Currently translated at 43.2% (745 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Translated using Weblate (Spanish) + +Currently translated at 92.5% (1595 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/es/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 93.6% (1615 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Greek) + +Currently translated at 43.2% (745 of 1724 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/el/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Chore: update summaly + +- Chore: Translated using Weblate (Japanese) + +Currently translated at 100.0% (1726 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ja/ + +- Chore: Translated using Weblate (Polish) + +Currently translated at 100.0% (1726 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/pl/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 95.0% (1640 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 95.2% (1644 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 100.0% (1726 of 1726 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: formatting + +- Chore: Merge branch 'origin/develop' into Weblate. + +- Chore: Translated using Weblate (English) + +Currently translated at 100.0% (1727 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ + +- Chore: Translated using Weblate (Russian) + +Currently translated at 99.8% (1724 of 1727 strings) + +Translation: Calckey/locales +Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ru/ + +- Chore: up pakcages + + +### Styling - Style announcement image -- Style: 💄 server metrics widgets + +## [13.2.0-beta6] - 2023-04-13 + +### Bug Fixes + +- Fix: add cargo to DOCKERFILE + +- Fix: add cargo to DOCKERFILE + +- Fix #9784 + +- Fix #9784 + +- Fix help button alignment iconsOnly + +- Fix indexing description + +- Fix: :passport_control: no longer need 2fa for webauthn + +- Fix import + +- Fix button alignments + +- Fix: dialogs not coming up + +- Fix: dockerfile + +- Fix: add copy for build from native-utils + +- Fix: changing passwords, 2fa, and password resets. + +The argon2 usage was only implemented for sign-ins which broke a bunch of other +endpoints and features. + +- Fix help button alignment iconsOnly + +- Fix indexing description + +- Fix: :passport_control: no longer need 2fa for webauthn + +- Fix import + +- Fix button alignments + +- Fix: dialogs not coming up + +- Fix: dockerfile + +- Fix: add copy for build from native-utils + +- Fix: changing passwords, 2fa, and password resets. + +The argon2 usage was only implemented for sign-ins which broke a bunch of other +endpoints and features. + +- Fix: buttons not showing + +- Fix: :bug: go to last timeline selected + +- Fix: toggling the blocking state from the instance-info admin view ([#9809](https://github.com/orhun/git-cliff/issues/9809)) + +Because the admin meta information was never loaded on this page, no amount of toggling the block or suspend sliders on the instance-info page (e.g. `https://calckey.example.com/instance-info/instance.tld`) will result in the instance actually being added to the blocklist. You could still do it from the bulk blocklist management page, but that can get unwieldy quickly if you just want to do a quick block of an instance. + +Co-authored-by: amy bones <amy@spookygirl.boo> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9809 +Co-authored-by: amybones <amybones@noreply.codeberg.org> +Co-committed-by: amybones <amybones@noreply.codeberg.org> + +- Fix + +- Fix(client): userpage ui ([#9179](https://github.com/orhun/git-cliff/issues/9179)) + +* fix(unverified): clip pages ui + +* fix(unverified): user page width + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +- Fix id of move activity + +- Fix move inbox + +- Fix: format script; chore: format + +- Fix: typo + +- Fix + +- Fix chat metadata + +- Fix lookup instance + + +### Documentation + +- Docs: hyperlink foundkey commits + +- Docs: hyperlink foundkey commits + + +### Features + +- Add VIPS to dockerfile + +- Add "speak as cat" setting to ja-jp + +- Add VIPS to dockerfile + +- Add "speak as cat" setting to ja-jp + +- Feat: :sparkles: push notifs button + +Co-authored-by: Tamania <tamaina@hotmail.co.jp> + +- Feat: give reason for soft mutes + +Bad UX when a post is muted and it just says "Some chick said something". Now +provide some context too to help people decide if they want to view something +potentially triggering. + +- Feat: blur muted text + +- Feat: add hidden hashtags management page + +This simply adds a basic admin UI to blocklist some hashtags from displaying in +the trending widget. The facility existed already in the backend, but there was +no UI to manipulate the list save for executing raw SQL or API calls. + +- Feat: per-user boost muting ([#9825](https://github.com/orhun/git-cliff/issues/9825)) + +Cherry-picked from FoundKey/c414f24a2c ([commit](https://akkoma.dev/FoundKeyGang/FoundKey/commit/c414f24a2c123774246c7eca65edda4d3afaf8b3)) + +This allows us to hide specified users' boosts from the timelines (the boosts will still be visible on their user page). + +Co-authored-by: Hélène <pleroma-dev@helene.moe> +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9825 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: messaging room banner + +- Feat: mark all as read action in chat + +- Feat: admin lookup files/instance + +- Feat: index posts action + +- Feat: lookup post action + + +### Miscellaneous Tasks + +- Chore: :art: format + +- Chore: remove okteto + +- Chore: update Japanese locale ([#9802](https://github.com/orhun/git-cliff/issues/9802)) + +- Chore: :art: format + +- Chore: remove okteto + +- Chore: update patrons + +- Chore: pnpm 8.1.1 + +- Chore: back button in control panel + +- Chore: back button in more places + +- Chore: rome formatting + +- Chore: formatting + +- Chore: up pnpm + +- Chore: formatting + +- Chore: update mfm-js version ([#9844](https://github.com/orhun/git-cliff/issues/9844)) + +This resolves #9757. + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9844 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + + +### Refactor + +- Refactor + + +### Styling + +- Style + +- Style + + +## [13.2.0-beta4] - 2023-04-01 + +### Bug Fixes + +- Fix + +- Fix + +- Fix callback url + +- Fix japanese locale + +- Fix? + +- Fix: allow announces with followers visibility + +- Fix: :bug: formlink -> button + +fixes notifications and drive in settings + +- Fix sounds settings + +- Fix doc link + +- Fix: direct boost ([#9783](https://github.com/orhun/git-cliff/issues/9783)) + +Sorry to create PR multiple times. I should have included this in #9778. + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9783 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Fix: don't nyaize quoted text + +- Fix: don't nyaize quoted text ([#9791](https://github.com/orhun/git-cliff/issues/9791)) + +- Fix search import + +- Fix migration + +- Fix: :bug: make recently used group + +Closes #9784 + + +### Documentation + +- Docs: add note about reverse migration + + +### Features + +- Feat: :sparkles: post metadata uses full @ + +Closes #9660 + +- Feat: new chat button on mobile + +- Feat: experimental post import + +- Add info + +- Feat: :sparkles: button in admin dash to index posts + +- Feat: custom KaTeX macro ([#9779](https://github.com/orhun/git-cliff/issues/9779)) + +Closes: #9759 +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9779 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Add rust to docker + +- Feat: :lock: add argon2 support + +Passwords will be automatically re-hashed on sign-in. All new password hashes will be argon2 by default. This uses argon2id and is not configurable. In the very unlikely case someone has more specific needs, a fork is recommended. ChangeLog: Added Co-authored-by: Chloe Kudryavtsev <code@toast.bunkerlabs.net> + +Breaks Calckey -> Misskey migration, but fixes Foundkey -> Calckey migration + +- Add argon + +- Feat: add option to boost with Home and Followers-only visibility ([#9788](https://github.com/orhun/git-cliff/issues/9788)) + +Closes: #9777 + +This pull request includes UI changes (please check the attached images). + +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9788 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: :sparkles: search now searches posts and users + +- Feat: :sparkles: help menu in navbar + +- Add top margin to help button + + +### Miscellaneous Tasks + +- Chore: update patron list + +- Chore: update patrons + +- Chore: bump pnpm + +- Update post job + +- Chore: :globe_with_meridians: locale changes + +Closes #9781 #9773 + +- Chore: :globe_with_meridians: locale changes + +Closes #9781 #9773 + +- Chore: update patron list + +- Chore: up pnpm + +- Chore: add cleanup migration + + +## [13.2.0-beta31] - 2023-03-24 + +### Bug Fixes + +- Fix: max user profile length to db field length + +Resolves: #9749 + +- Fix: :bug: no nyaizing undefined text + +Closes #9752 + +- Fix: a bug in ads + +- Fix color in follow button + +- Fix: relay signature handling + +A change sometime ago moved to setting some signature fields in the incoming +object to undefined as opposed to deleting them. The trouble is that downstream +code checks against existence, not undefinedness and rejects the message. + +Resolves: #9665 + + +### Documentation + +- Docs: sonic + + +### Features + +- Feat: swap home timeline with social's functionality ([#9597](https://github.com/orhun/git-cliff/issues/9597)) + +The Home timeline functionality is swapped with social's. Meaning that Home timeline now consists of followee's and local posts. Social from now on will contain only followee's posts. See more info in the attached ticket. + +Some changes applied in english locales as well. Probably the rest of the languages need to be fixed though. + +This PR closes the ticket: https://codeberg.org/calckey/calckey/issues/9552 + +Co-authored-by: yawhn <kordaris@gmail.com> +Co-authored-by: ThatOneCalculator <kainoa@t1c.dev> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9597 +Co-authored-by: yawhn <yawhn@noreply.codeberg.org> +Co-committed-by: yawhn <yawhn@noreply.codeberg.org> + +- Feat: add sonic to docker + +- Feat: masto api add display name + + +### Miscellaneous Tasks + +- Chore: :package: upgrade megalodon + + +## [13.2.0-beta2] - 2023-03-21 + +### Bug Fixes + +- Fix deck view margins + +- Fix: Parse mastoAPI `limit` argument in more places & Improve converting arguments to boolean ([#9716](https://github.com/orhun/git-cliff/issues/9716)) + +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9716 +Authored-by: fruye <fruye@unix.dog> +Signed-off-by: Cleo John <waterdev@galaxycrow.de> +Co-authored-by: fruye <fruye@unix.dog> +Co-committed-by: fruye <fruye@unix.dog> + +- Fix: send button + +- Fix: intermediarily convert ids + +- Fix: mobile button alignment + +- Fix: when count is actually 0 + +- Fix cli more + +- Fix: don't show smartphone UI when settings icon is double-clicked + +- Fix: unicode aliases + +- Fix: repo url + +- Fix: :bug: can't send blank messages + +Closes #9661 + +- Fix: make sure cw button is on new line + +- Fix: local time for users + + +### Documentation + +- Docs: changes + +- Docs: 📝 sonic instructions + +- Docs: 📝 sonic + + +### Features + +- Feat: Make follower counts for remote users correct ([#9705](https://github.com/orhun/git-cliff/issues/9705)) + +#9293 + +Not sure if this is the right approach for this + +Co-authored-by: s1idewhist1e <trombonedude05@gmail.com> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9705 +Co-authored-by: s1idewhist1e <s1idewhist1e@noreply.codeberg.org> +Co-committed-by: s1idewhist1e <s1idewhist1e@noreply.codeberg.org> + +- Add 404 as replacements + +- Feat: set license information for custom emojis ([#9719](https://github.com/orhun/git-cliff/issues/9719)) + +Closes: #9711 (please check this issue first) + +I cherry-picked two commits ([1](https://github.com/misskey-dev/misskey/commit/8ae9d2eaa8b0842671558370f787902e94b7f5a3), [2](https://github.com/misskey-dev/misskey/commit/ed51209172441927d24339f0759a5badbee3c9b6)) from [Misskey](https://github.com/misskey-dev/misskey) and made a few changes. +「ライセンス」should be written as "License" in the following screenshots, but it has not yet been translated. + +It would be nice if we could include multiple lines of text, but I just ported what's been implemented so far in Misskey not to mess things up. + +This is my first pull request (aside from typo correction). Feel free to point out any issues! + + + + + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> +Co-authored-by: naskya <m@naskya.net> +Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9719 +Co-authored-by: naskya <naskya@noreply.codeberg.org> +Co-committed-by: naskya <naskya@noreply.codeberg.org> + +- Feat: compile time compression + +- Feat: spruce up CLI + +- Feat: :sparkles: more themes! + + +### Miscellaneous Tasks + +- Chore: update megalodon + +- Chore: update package locks + +- Chore: bump pnpm version + +- Chore: add emoji aliases + + +### Refactor + +- Refactor: nyaize on the frontend ## [13.2.0-beta3] - 2023-03-16 @@ -2096,6 +2960,8 @@ Needed for pleromaFE to display a timeline. - Fix line alignment in smaller windows +## [13.2.0-beta] - 2023-03-15 + ## [13.1.3] - 2023-03-14 ### Bug Fixes @@ -3574,10 +4440,10 @@ fix: :fire: Remove meta implementation in routing for now - Feat: show header with current user avatar on TL ([#9051](https://github.com/orhun/git-cliff/issues/9051)) -* feat: show header with current user avatar on TL - -* refactor(client): use displayMyAvatar prop instead of metadata - +* feat: show header with current user avatar on TL + +* refactor(client): use displayMyAvatar prop instead of metadata + * refactor(client): prefer v-if to `display: none;` - Feat: :bookmark: .1 @@ -3690,23 +4556,23 @@ From yarn upgrade-interactive - Chore(sw): only proxies HTML requests ([#9070](https://github.com/orhun/git-cliff/issues/9070)) -* chore(sw): only proxies HTML requests - -もはやHTMLじゃなさそうなリクエストにはSWで関与しないようにする - -こうするといろいろな面倒事が解決するはず…たぶん - -Resolve #9037 -Resolve #9038 - -* align code style - -* Update packages/sw/src/sw.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> -Co-authored-by: tamaina <tamaina@hotmail.co.jp> +* chore(sw): only proxies HTML requests + +もはやHTMLじゃなさそうなリクエストにはSWで関与しないようにする + +こうするといろいろな面倒事が解決するはず…たぶん + +Resolve #9037 +Resolve #9038 + +* align code style + +* Update packages/sw/src/sw.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> +Co-authored-by: tamaina <tamaina@hotmail.co.jp> Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Chore: :twisted_rightwards_arrows: Merge upstream to 12.119.0 @@ -3834,57 +4700,57 @@ Fix #9043 - Feature: Client Preferences Registry ([#8511](https://github.com/orhun/git-cliff/issues/8511)) -* Fix settings page - -* nanka iroiro - -* clean up - -* clean up - -* feature: Client Preferences Registry on the account - -* add changelog - -* インデックスに戻ってもタイトルが残ってしまうのを修正 - -* fix createdAt -> updatedAt - -* remove console.log - -* 適用→このデバイスに適用 - -* add wallpaper - -* ローカルのjsonファイルを保存・読み込みできるように - -* clean up - -* use apiWithDialog - -* Update packages/client/src/pages/settings/preferences-registry.vue - -Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> - -* Update packages/client/src/pages/settings/preferences-registry.vue - -Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> - -* Update packages/client/src/pages/settings/preferences-registry.vue - -Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> - -* fix lint - -* :v: - -* change router - -* nanka iroiro - -* tweak - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> +* Fix settings page + +* nanka iroiro + +* clean up + +* clean up + +* feature: Client Preferences Registry on the account + +* add changelog + +* インデックスに戻ってもタイトルが残ってしまうのを修正 + +* fix createdAt -> updatedAt + +* remove console.log + +* 適用→このデバイスに適用 + +* add wallpaper + +* ローカルのjsonファイルを保存・読み込みできるように + +* clean up + +* use apiWithDialog + +* Update packages/client/src/pages/settings/preferences-registry.vue + +Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> + +* Update packages/client/src/pages/settings/preferences-registry.vue + +Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> + +* Update packages/client/src/pages/settings/preferences-registry.vue + +Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> + +* fix lint + +* :v: + +* change router + +* nanka iroiro + +* tweak + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> Co-authored-by: Andreas Nedbal <github-bf215181b5140522137b3d4f6b73544a@desu.email> - Feat(client): improve widget @@ -3973,10 +4839,10 @@ Fix #9026 - Fix: broken chats ([#8983](https://github.com/orhun/git-cliff/issues/8983)) -* Fix broken chats - -Co-authored-by: @ltlapy - +* Fix broken chats + +Co-authored-by: @ltlapy + * :art: - Fix @@ -4008,19 +4874,19 @@ Co-authored-by: @ltlapy - Chore(deps): bump terser from 5.9.0 to 5.14.2 ([#9024](https://github.com/orhun/git-cliff/issues/9024)) -Bumps [terser](https://github.com/terser/terser) from 5.9.0 to 5.14.2. -- [Release notes](https://github.com/terser/terser/releases) -- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) -- [Commits](https://github.com/terser/terser/commits) - ---- -updated-dependencies: -- dependency-name: terser - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [terser](https://github.com/terser/terser) from 5.9.0 to 5.14.2. +- [Release notes](https://github.com/terser/terser/releases) +- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) +- [Commits](https://github.com/terser/terser/commits) + +--- +updated-dependencies: +- dependency-name: terser + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak theme select ui @@ -4030,33 +4896,33 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump file-type from 17.1.2 to 17.1.3 in /packages/backend ([#9030](https://github.com/orhun/git-cliff/issues/9030)) -Bumps [file-type](https://github.com/sindresorhus/file-type) from 17.1.2 to 17.1.3. -- [Release notes](https://github.com/sindresorhus/file-type/releases) -- [Commits](https://github.com/sindresorhus/file-type/compare/v17.1.2...v17.1.3) - ---- -updated-dependencies: -- dependency-name: file-type - dependency-type: direct:production -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [file-type](https://github.com/sindresorhus/file-type) from 17.1.2 to 17.1.3. +- [Release notes](https://github.com/sindresorhus/file-type/releases) +- [Commits](https://github.com/sindresorhus/file-type/compare/v17.1.2...v17.1.3) + +--- +updated-dependencies: +- dependency-name: file-type + dependency-type: direct:production +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump undici from 5.5.1 to 5.8.0 in /packages/backend ([#9028](https://github.com/orhun/git-cliff/issues/9028)) -Bumps [undici](https://github.com/nodejs/undici) from 5.5.1 to 5.8.0. -- [Release notes](https://github.com/nodejs/undici/releases) -- [Commits](https://github.com/nodejs/undici/compare/v5.5.1...v5.8.0) - ---- -updated-dependencies: -- dependency-name: undici - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [undici](https://github.com/nodejs/undici) from 5.5.1 to 5.8.0. +- [Release notes](https://github.com/nodejs/undici/releases) +- [Commits](https://github.com/nodejs/undici/compare/v5.5.1...v5.8.0) + +--- +updated-dependencies: +- dependency-name: undici + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak style @@ -5326,25 +6192,25 @@ Closes #2519 - Fix(package): update @types/node to version 10.9.4 - Fix #2315 ([#2339](https://github.com/orhun/git-cliff/issues/2339)) -* improve MFM to html - -* improve html to MFM - -* missing semicolon - -* missing semicolon - -* fix html to MFM - -タグのリンクは解除するように - -* fix bug - -* misssing semicolon - -* Update html-to-mfm.ts - -* Update html-to-mfm.ts +* improve MFM to html + +* improve html to MFM + +* missing semicolon + +* missing semicolon + +* fix html to MFM + +タグのリンクは解除するように + +* fix bug + +* misssing semicolon + +* Update html-to-mfm.ts + +* Update html-to-mfm.ts - Fix @@ -5613,11 +6479,11 @@ Closes #2986 - Fix #5214 ウィジェットが選択されていないときは追加されないように ([#5227](https://github.com/orhun/git-cliff/issues/5227)) -* fix #5214 - -* null削除の取り消し - -* 空白文字の調整 +* fix #5214 + +* null削除の取り消し + +* 空白文字の調整 - Fix typo in misskey.nginx ([#5445](https://github.com/orhun/git-cliff/issues/5445)) @@ -5700,15 +6566,15 @@ Close #6434 - Fix サイドバーの設定に不具合があるとページが表示できなくなる ([#6473](https://github.com/orhun/git-cliff/issues/6473)) -* fix #6460 - -* Update app.vue - +* fix #6460 + +* Update app.vue + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix 非ログイン時に n または p キー押下で投稿フォームが出る ([#6508](https://github.com/orhun/git-cliff/issues/6508)) -* fix #5851 - +* fix #5851 + * post-formのスポーンを弾く場所を変更 - Fix(client): Fix style @@ -5944,20 +6810,20 @@ Resolve #7540 - Fix: truncate user information if it is too long ([#7629](https://github.com/orhun/git-cliff/issues/7629)) -* truncate user information if it is too long - -Some AP software allows for user names or summaries to be very long. -Misskey can not handle this and the profile page can not be opened and -no activities from such users can be seen. - -Instead, the user name and summary are cut off after the maximum length -so misskey can still process the activities of the profile. - -Co-authored-by: Toast <toast@toast.cafe> - -* fix code style - -Co-authored-by: Toast <toast@toast.cafe> +* truncate user information if it is too long + +Some AP software allows for user names or summaries to be very long. +Misskey can not handle this and the profile page can not be opened and +no activities from such users can be seen. + +Instead, the user name and summary are cut off after the maximum length +so misskey can still process the activities of the profile. + +Co-authored-by: Toast <toast@toast.cafe> + +* fix code style + +Co-authored-by: Toast <toast@toast.cafe> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix typo @@ -6001,17 +6867,17 @@ Fix #7648 - Fix missing strings ([#7674](https://github.com/orhun/git-cliff/issues/7674)) -* fix sort menu in federation panel - -* add missing strings in report menu - +* fix sort menu in federation panel + +* add missing strings in report menu + * change i18n key too - Fix Dockerfile ([#7763](https://github.com/orhun/git-cliff/issues/7763)) -* fix Dockerfile - -* remove unnecessary change - +* fix Dockerfile + +* remove unnecessary change + * add misskey-assets in .dockerignore - Fix(server): ノート翻訳時に公開範囲が考慮されていない問題を修正 @@ -6045,32 +6911,32 @@ from: https://gitlab.com/xianon/misskey/-/commit/a89742319caea378f9cdd70c8ebd83b - Fix: truncate image descriptions ([#7699](https://github.com/orhun/git-cliff/issues/7699)) -* move truncate function to separate file to reuse it - -* truncate image descriptions - -* show image description limit in UI - -* correctly treat null - -Co-authored-by: nullobsi <me@nullob.si> - -* make truncate Unicode-aware - -The strings that truncate returns should now be valid Unicode. - -PostgreSQL also counts Unicode Code Points instead of bytes so this -should be correct. - -* move truncate to internal, validate in API - -Truncating could also be done in src/services/drive/add-file.ts or -src/services/drive/upload-from-url.ts but those would also affect -local images. But local images should result in a hard error if the -image comment is too long. - -* avoid overwriting - +* move truncate function to separate file to reuse it + +* truncate image descriptions + +* show image description limit in UI + +* correctly treat null + +Co-authored-by: nullobsi <me@nullob.si> + +* make truncate Unicode-aware + +The strings that truncate returns should now be valid Unicode. + +PostgreSQL also counts Unicode Code Points instead of bytes so this +should be correct. + +* move truncate to internal, validate in API + +Truncating could also be done in src/services/drive/add-file.ts or +src/services/drive/upload-from-url.ts but those would also affect +local images. But local images should result in a hard error if the +image comment is too long. + +* avoid overwriting + Co-authored-by: nullobsi <me@nullob.si> - Fix bug @@ -6135,33 +7001,33 @@ Fix #7905 - Fix: Fix #7895 ([#7937](https://github.com/orhun/git-cliff/issues/7937)) -* Fix #7895 - +* Fix #7895 + * CHANGELOG - Fix: 削除したノートやユーザーがリモートから参照されると復活することがあるのを修正 ([#7918](https://github.com/orhun/git-cliff/issues/7918)) -* Fix #7557 - -* CHANGELOG - -* Fix user - -* CHANGELOG - -* Tune CHANGELOG - -* Tune CHANGELOG - -* resolver - -* Remove check - -* Remove import - -* CHANGELOG - -* Tune - +* Fix #7557 + +* CHANGELOG + +* Fix user + +* CHANGELOG + +* Tune CHANGELOG + +* Tune CHANGELOG + +* resolver + +* Remove check + +* Remove import + +* CHANGELOG + +* Tune + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix(client): ページ編集時のドロップダウンメニューなどが動作しない問題を修正 @@ -6175,10 +7041,10 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix(client): Add missing localization string ([#7944](https://github.com/orhun/git-cliff/issues/7944)) -* 欠けるi18nストリングの追加 - -* Update ja-JP.yml - +* 欠けるi18nストリングの追加 + +* Update ja-JP.yml + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix @@ -6196,12 +7062,12 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix: mention local users in replies ([#7975](https://github.com/orhun/git-cliff/issues/7975)) -* mention local users in replies - +* mention local users in replies + * fix merge - Fix(client): reaction viewer layout ([#7942](https://github.com/orhun/git-cliff/issues/7942)) -The profile picture and name should be grouped together as they belong, and +The profile picture and name should be grouped together as they belong, and it should be clear which picture belongs to which name. - Fix for lint @@ -6216,8 +7082,8 @@ it should be clear which picture belongs to which name. - Fix(client): fix plugin activate and uninstall ([#7991](https://github.com/orhun/git-cliff/issues/7991)) -* fix(client): fix plugin activate and uninstall - +* fix(client): fix plugin activate and uninstall + * Fix(client): fix package activates - Fix(client): better error handling of file upload @@ -6227,48 +7093,48 @@ it should be clear which picture belongs to which name. - Fix: toolsが動かないのを修正 ([#8008](https://github.com/orhun/git-cliff/issues/8008)) -* Move tools - +* Move tools + * Fix DB - Fix: notification.vueのIntersectionObserverまわりを修正 ([#8010](https://github.com/orhun/git-cliff/issues/8010)) -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* Update packages/client/src/components/notification.vue - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* disconnect - -* oops - +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* Update packages/client/src/components/notification.vue + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* disconnect + +* oops + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Fix(client): モバイルでタップしたときにツールチップが表示される問題を修正 - Fix: LTLやGTLが無効になっている場合でもUI上にタブが表示される問題を修正 ([#8026](https://github.com/orhun/git-cliff/issues/8026)) -* wip - -* add changelog - +* wip + +* add changelog + * 変換ミス修正 - Fix mentions in replies ([#8030](https://github.com/orhun/git-cliff/issues/8030)) - Fix: 画像ファイルの縦横サイズの取得で Exif Orientation を考慮する ([#8014](https://github.com/orhun/git-cliff/issues/8014)) -* 画像ファイルの縦横サイズの取得で Exif Orientation を考慮する - -* test: Add rotate.jpg test - -* Webpublic 画像を返す時のみ Exif Orientation を考慮して縦横サイズを返す - +* 画像ファイルの縦横サイズの取得で Exif Orientation を考慮する + +* test: Add rotate.jpg test + +* Webpublic 画像を返す時のみ Exif Orientation を考慮して縦横サイズを返す + * test: Support orientation - Fix(server): Fix #8032 @@ -6359,35 +7225,35 @@ https://github.com/misskey-dev/misskey/commit/d53795184cd0ee326b0da58b267e3460f9 - Fix: proxyでsvgをpngに変換するように ([#8106](https://github.com/orhun/git-cliff/issues/8106)) -* wip - -* revert send-drive-file change - -* fix - -* Update packages/backend/src/server/proxy/proxy-media.ts - -Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> - +* wip + +* revert send-drive-file change + +* fix + +* Update packages/backend/src/server/proxy/proxy-media.ts + +Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> + Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> - Fix: code url in documentation ([#8117](https://github.com/orhun/git-cliff/issues/8117)) It seems this was not changed while refactoring the modules apart. - Fix([#8133](https://github.com/orhun/git-cliff/issues/8133)): hCaptcha の reCAPTCHA 互換挙動を無効化する ([#8135](https://github.com/orhun/git-cliff/issues/8135)) -* fix([#8133](https://github.com/orhun/git-cliff/issues/8133)): hCaptcha の reCAPTCHA 互換挙動を無効化する - -* Update packages/client/src/components/captcha.vue - -* fix: hCaptcha host - +* fix([#8133](https://github.com/orhun/git-cliff/issues/8133)): hCaptcha の reCAPTCHA 互換挙動を無効化する + +* Update packages/client/src/components/captcha.vue + +* fix: hCaptcha host + Co-authored-by: tamaina <tamaina@hotmail.co.jp> - Fix(client): タイムラインのkeep-aliveが効かなくなっているのを修正 - Fix: アップロードエラー時の処理を修正 ([#8182](https://github.com/orhun/git-cliff/issues/8182)) -* アップロードのエラー応答で詰むのを修正 - +* アップロードのエラー応答で詰むのを修正 + * CHANGELOG - Fix: change keypress to keydown ([#8192](https://github.com/orhun/git-cliff/issues/8192)) @@ -6418,41 +7284,41 @@ Fix #8212 - Fix federation widged ([#8221](https://github.com/orhun/git-cliff/issues/8221)) -The variables accidentally shadowed the variables that contain the ref's +The variables accidentally shadowed the variables that contain the ref's to be rendered into the template. - Fix federation widget - Fix eslint rule - Fix: ensure that specified users does not get duplicates ([#8233](https://github.com/orhun/git-cliff/issues/8233)) -* ensure that specified users does not get duplicates - -* Update packages/client/src/components/post-form.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - +* ensure that specified users does not get duplicates + +* Update packages/client/src/components/post-form.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix: Fix Sideview ([#8235](https://github.com/orhun/git-cliff/issues/8235)) -* Fix #7890 - -* a- - -* 3度目の正直 - -* fix - -* :v: - -* update CHANGELOG - +* Fix #7890 + +* a- + +* 3度目の正直 + +* fix + +* :v: + +* update CHANGELOG + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix(client): ツールチップの表示位置が正しくない問題を修正 - Fix: ストリーミングからのAPIリクエストが出来ないのを修正 ([#8244](https://github.com/orhun/git-cliff/issues/8244)) -* Update call.ts - +* Update call.ts + * あれ - Fix(client): fix compare-versions import @@ -6462,30 +7328,30 @@ Fix #6831 - Fix chart clean - Fix: NodeInfo のユーザー数と投稿数の内容を見直す ([#8255](https://github.com/orhun/git-cliff/issues/8255)) -* NodeInfoのアクティブユーザーの取得方法を変更する - +* NodeInfoのアクティブユーザーの取得方法を変更する + * NodeInfoの投稿数の出力内容を見直す - Fix - Fix: v-sizeディレクティブの動作を修正 ([#8249](https://github.com/orhun/git-cliff/issues/8249)) -* Fix size directive behavior not activated - -* calc - -* wip - -* cache computed classes - -* fix Vue3では使えなくなった - -* 不要なIntersection Observerを削除 - +* Fix size directive behavior not activated + +* calc + +* wip + +* cache computed classes + +* fix Vue3では使えなくなった + +* 不要なIntersection Observerを削除 + * comment - Fix: instance ticker ([#8260](https://github.com/orhun/git-cliff/issues/8260)) -* add type and default values - +* add type and default values + * remove unnecessary string operation - Fix(server): system queueが動いていないのを修正 @@ -6519,23 +7385,23 @@ Fix #8252 - Fix: regular expressions in word mutes ([#8254](https://github.com/orhun/git-cliff/issues/8254)) -* fix: handle regex exceptions for word mutes - -* add i18n strings - -Co-authored-by: rinsuki <428rinsuki+git@gmail.com> - -* stricter input validation in backend - -* add migration for hard mutes - -* fix - -* use correct regex library in migration - -* use query builder to avoid SQL injection - -Co-authored-by: Robin B <robflop98@outlook.com> +* fix: handle regex exceptions for word mutes + +* add i18n strings + +Co-authored-by: rinsuki <428rinsuki+git@gmail.com> + +* stricter input validation in backend + +* add migration for hard mutes + +* fix + +* use correct regex library in migration + +* use query builder to avoid SQL injection + +Co-authored-by: Robin B <robflop98@outlook.com> Co-authored-by: rinsuki <428rinsuki+git@gmail.com> - Fix(client): word mute cannot save @@ -6568,26 +7434,26 @@ Fix #8071 - Fix: also recognize "shortcut icon" favicon ([#8220](https://github.com/orhun/git-cliff/issues/8220)) -* also recognize "shortcut icon" favicon - -Not using querySelector for this because it uses jsdom which might be slower. -Reversing the order because WHATWG says the last appropriate link should be used. - -* also fetchIconUrl - -* br - -* improve readability - -* fix - -* フォールバックにhrefの評価を含める - -* fix val name - -* 将来的な拡張を考えたコードにした - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> +* also recognize "shortcut icon" favicon + +Not using querySelector for this because it uses jsdom which might be slower. +Reversing the order because WHATWG says the last appropriate link should be used. + +* also fetchIconUrl + +* br + +* improve readability + +* fix + +* フォールバックにhrefの評価を含める + +* fix val name + +* 将来的な拡張を考えたコードにした + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix: better language settings @@ -6635,12 +7501,12 @@ Fix #8318 - Fix: iPhone X以降(?)でページの内容が全て表示しきれないのを修正 ([#8375](https://github.com/orhun/git-cliff/issues/8375)) -* add safe-area-inset-bottom to spacer - -* fix - -* :v: - +* add safe-area-inset-bottom to spacer + +* fix + +* :v: + * fix - Fix federation chart @@ -6659,7 +7525,7 @@ Fix #8392 - Fix API console ([#8416](https://github.com/orhun/git-cliff/issues/8416)) -Adjusted the server to send the API description based on the new +Adjusted the server to send the API description based on the new API type declarations introduced previously. - Fix(client): fix popup menu direction calclation @@ -6680,10 +7546,10 @@ Fix #8455 - Fix(federation): avoid duplicate activity delivery ([#8429](https://github.com/orhun/git-cliff/issues/8429)) -* prefer shared inbox over individual inbox - -* no new shared inbox for direct recipes - +* prefer shared inbox over individual inbox + +* no new shared inbox for direct recipes + * fix type error - Fix syntax error @@ -6694,12 +7560,12 @@ Fix #8455 - Fix: validation ([#8456](https://github.com/orhun/git-cliff/issues/8456)) ([#8461](https://github.com/orhun/git-cliff/issues/8461)) -* Revert "revert 484e023c0" - -This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. - -* also allow pure renote - +* Revert "revert 484e023c0" + +This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. + +* also allow pure renote + * fix checks for pure renote - Fix e2e test @@ -6715,34 +7581,34 @@ This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. - Fix: アンテナ、クリップ、リストの表示を速くする ([#8518](https://github.com/orhun/git-cliff/issues/8518)) -* アンテナノートを取得するクエリがタイムアウトしないように速くする - -* テーブル名を直接指定しないようにする - -* クリップの取得を速くする - +* アンテナノートを取得するクエリがタイムアウトしないように速くする + +* テーブル名を直接指定しないようにする + +* クリップの取得を速くする + * リストの取得を速くする - Fix: Fix settings page ([#8508](https://github.com/orhun/git-cliff/issues/8508)) -* Fix settings page - -* nanka iroiro - -* clean up - -* clean up - +* Fix settings page + +* nanka iroiro + +* clean up + +* clean up + * インデックスに戻ってもタイトルが残ってしまうのを修正 - Fix ogp rendering and refactor - Fix: アンテナ、クリップ、リストの表示を速くする ([#8518](https://github.com/orhun/git-cliff/issues/8518)) -* アンテナノートを取得するクエリがタイムアウトしないように速くする - -* テーブル名を直接指定しないようにする - -* クリップの取得を速くする - +* アンテナノートを取得するクエリがタイムアウトしないように速くする + +* テーブル名を直接指定しないようにする + +* クリップの取得を速くする + * リストの取得を速くする - Fix: Promises -> Promise ([#8545](https://github.com/orhun/git-cliff/issues/8545)) @@ -6752,8 +7618,8 @@ This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. - Fix: Add rel attribute to host-meta ([#8583](https://github.com/orhun/git-cliff/issues/8583)) -* Add rel attribute to host-meta - +* Add rel attribute to host-meta + * CHANGELOG - Fix _misskey_content of quote renotes ([#8533](https://github.com/orhun/git-cliff/issues/8533)) @@ -6777,8 +7643,8 @@ This reverts commit c03b70c949923b830a6d0361d1aa4d5f5614b7b7. - Fix: ユーザー検索で、クエリがusernameの条件を満たす場合はusernameもLIKE検索するように ([#8644](https://github.com/orhun/git-cliff/issues/8644)) -* Fix #8643 - +* Fix #8643 + * 部分一致にする - Fix(client): additional background for acrylic popups if unsupported @@ -6795,32 +7661,32 @@ Fix a bug introduced in #8659. Solution was already tested there. - Fix: ノートのインスタンス情報の文字に縁を付けて見やすくする ([#8697](https://github.com/orhun/git-cliff/issues/8697)) -* ノートのインスタンス情報の背景色が反映されないことがあるのを修正する - -* ノートのインスタンス情報の文字に縁を付けて見やすくする - -* Revert "ノートのインスタンス情報の背景色が反映されないことがあるのを修正する" - -This reverts commit de920dfc537d1f2c68804d0d6930520f2b3cbce7. - +* ノートのインスタンス情報の背景色が反映されないことがあるのを修正する + +* ノートのインスタンス情報の文字に縁を付けて見やすくする + +* Revert "ノートのインスタンス情報の背景色が反映されないことがあるのを修正する" + +This reverts commit de920dfc537d1f2c68804d0d6930520f2b3cbce7. + * ノートのインスタンス情報の文字の影の数を増やしてさらに見やすくする - Fix: Unable to generate video thumbnails ([#8696](https://github.com/orhun/git-cliff/issues/8696)) -* fix: Unable to generate video thumbnails - +* fix: Unable to generate video thumbnails + * CHANGELOG - Fix(client): fix lint issues in Deck UI components ([#8681](https://github.com/orhun/git-cliff/issues/8681)) - Fix: ノート詳細ページの新しいノートを表示する機能の動作が正しくなるように修正する ([#8607](https://github.com/orhun/git-cliff/issues/8607)) -* ノート詳細で新しいノートの表示が正しくないのを修正する - +* ノート詳細で新しいノートの表示が正しくないのを修正する + * ノート詳細から別のノート詳細を表示した時に前後の表示をリセットする - Fix(activitypub): add authorization checks ([#8534](https://github.com/orhun/git-cliff/issues/8534)) -* fix spelling - +* fix spelling + * fix(activitypub): add authorization checks - Fix(client): make emoji stand out more on reaction button @@ -6841,24 +7707,24 @@ Co-Authored-By: Johann150 <20990607+Johann150@users.noreply.github.com> - Fix: assume remote users are following each other ([#8734](https://github.com/orhun/git-cliff/issues/8734)) -Misskey does not know if two remote users are following each other. -Because ActivityPub actions would otherwise fail on followers only -notes, we have to assume that two remote users are following each other +Misskey does not know if two remote users are following each other. +Because ActivityPub actions would otherwise fail on followers only +notes, we have to assume that two remote users are following each other when an interaction about a remote note occurs. - Fix lints ([#8737](https://github.com/orhun/git-cliff/issues/8737)) -* fix: emits use ev instead of e - -* fix: errors use err instead of e - -* fix: replace use of data where possible - -* fix: events use evt instead of e - -* fix: use strict equals - -* fix: use emoji instead of e - +* fix: emits use ev instead of e + +* fix: errors use err instead of e + +* fix: replace use of data where possible + +* fix: events use evt instead of e + +* fix: use strict equals + +* fix: use emoji instead of e + * fix: vue lints - Fix(docs): correct information for drive upload ([#8736](https://github.com/orhun/git-cliff/issues/8736)) @@ -6868,12 +7734,12 @@ when an interaction about a remote note occurs. fix #8747 - Fix(client): Vite related boot mechanism revision ([#8753](https://github.com/orhun/git-cliff/issues/8753)) -* preload app css - -* remove salt - -* APP_FETCH_FAILED error - +* preload app css + +* remove salt + +* APP_FETCH_FAILED error + * set max-age to 15s - Fix(client): fix popout url ([#8494](https://github.com/orhun/git-cliff/issues/8494)) @@ -6905,56 +7771,56 @@ fix #8756 - Fix: correctly render empty note text ([#8746](https://github.com/orhun/git-cliff/issues/8746)) -Ensure that the _misskey_content attribute will always exist. Because -the API endpoint does not require the existence of the `text` field, -that field may be `undefined`. By using `?? null` it can be ensured -that the value is at least `null`. - -Furthermore, the rendered HTML of a note with empty text will also be -the empty string. From git blame it seems that this behaviour was added -because of a Mastodon bug that might have previously existed. Hoever, -this seems to be no longer the case as I can find mastodon posts that -have empty content. - -The code could be made a bit more succinct by using the null coercion +Ensure that the _misskey_content attribute will always exist. Because +the API endpoint does not require the existence of the `text` field, +that field may be `undefined`. By using `?? null` it can be ensured +that the value is at least `null`. + +Furthermore, the rendered HTML of a note with empty text will also be +the empty string. From git blame it seems that this behaviour was added +because of a Mastodon bug that might have previously existed. Hoever, +this seems to be no longer the case as I can find mastodon posts that +have empty content. + +The code could be made a bit more succinct by using the null coercion operator. - Fix: ensure resolver does not fetch local resources via HTTP(S) ([#8733](https://github.com/orhun/git-cliff/issues/8733)) -* refactor: parseUri types and checks - -The type has been refined to better represent what it actually is. Uses of -parseUri are now also checking the parsed object type before resolving. - -* cannot resolve URLs with fragments - -* also take remaining part of URL into account - -Needed for parsing the follows URIs. - -* Resolver uses DbResolver for local - -* remove unnecessary use of DbResolver - -Using DbResolver would mean that the URL is parsed and handled again. -This duplicated processing can be avoided by querying the database directly. - +* refactor: parseUri types and checks + +The type has been refined to better represent what it actually is. Uses of +parseUri are now also checking the parsed object type before resolving. + +* cannot resolve URLs with fragments + +* also take remaining part of URL into account + +Needed for parsing the follows URIs. + +* Resolver uses DbResolver for local + +* remove unnecessary use of DbResolver + +Using DbResolver would mean that the URL is parsed and handled again. +This duplicated processing can be avoided by querying the database directly. + * fix missing property name - Fix: add id for activitypub follows ([#8689](https://github.com/orhun/git-cliff/issues/8689)) -* add id for activitypub follows - -* fix lint - -* fix: follower must be local, followee must be remote - -Misskey will only use ActivityPub follow requests for users that are local -and are requesting to follow a remote user. This check is to ensure that -this endpoint can not be used by other services or instances. - -* fix: missing import - -* render block with id - +* add id for activitypub follows + +* fix lint + +* fix: follower must be local, followee must be remote + +Misskey will only use ActivityPub follow requests for users that are local +and are requesting to follow a remote user. This check is to ensure that +this endpoint can not be used by other services or instances. + +* fix: missing import + +* render block with id + * fix comment - Fix test @@ -6987,10 +7853,10 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix: some fixes of multiple notification read ([#8819](https://github.com/orhun/git-cliff/issues/8819)) -* fix: limit multiple notification read - -* fix - +* fix: limit multiple notification read + +* fix + * fix - Fix(client): デッキでウィジェットの情報が保存されない問題を修正 @@ -7005,24 +7871,24 @@ Fix #8818 - Fix: add limit to i/notifications ([#8836](https://github.com/orhun/git-cliff/issues/8836)) -* fix: add limit to i/notifications - -* ms - +* fix: add limit to i/notifications + +* ms + * remove ms - Fix: tmpdir cleanup removes contained files ([#8826](https://github.com/orhun/git-cliff/issues/8826)) - Fix: GenerateVideoThumbnail ([#8825](https://github.com/orhun/git-cliff/issues/8825)) -* fix: GenerateVideoThumbnail - -* CHANGELOG - -* fix cleanup - -* Revert "fix cleanup" - +* fix: GenerateVideoThumbnail + +* CHANGELOG + +* fix cleanup + +* Revert "fix cleanup" + This reverts commit d54cf8262ac01a3deb6b8dd7689ec144d4d09ea8. - Fix: correctly render note text @@ -7061,17 +7927,17 @@ Instead of coercing to `null`, coercing to an empty string should simplify handl - Fix: always respect instance mutes ([#8854](https://github.com/orhun/git-cliff/issues/8854)) -* fix: muted user query also checks instances - -This way it can be ensured that the instance mute is used everywhere it -is required without checking the whole codebase again. Muted users and -muted instances should be used together anyways. - +* fix: muted user query also checks instances + +This way it can be ensured that the instance mute is used everywhere it +is required without checking the whole codebase again. Muted users and +muted instances should be used together anyways. + * fix lint - Fix(client): only enable hotkeys for logged in users ([#8793](https://github.com/orhun/git-cliff/issues/8793)) -* fix(client): only enable hotkeys for logged in users - +* fix(client): only enable hotkeys for logged in users + * fix(client): keep theme and search hotkeys for logged out users - Fix notification-setting-window.vue @@ -7081,28 +7947,28 @@ muted instances should be used together anyways. - Fix: mocha テストが動かないのを修正 v2 ([#8892](https://github.com/orhun/git-cliff/issues/8892)) -* on push - -* Fix mute test - -* fix note test - -* api - -* inc timeout - -* uploadUrl - -* Revert "on push" - -This reverts commit 778a58df61ff9a22421f8ec5dcce96b364eab38d. - -* lint - -* waitFire - -* Wrap connectStream - +* on push + +* Fix mute test + +* fix note test + +* api + +* inc timeout + +* uploadUrl + +* Revert "on push" + +This reverts commit 778a58df61ff9a22421f8ec5dcce96b364eab38d. + +* lint + +* waitFire + +* Wrap connectStream + * return - Fix(api): add missing themeColor property of instance @@ -7185,8 +8051,8 @@ fixes #8944 - Fix: QueryFailedError when logging user's IPs ([#8973](https://github.com/orhun/git-cliff/issues/8973)) -* fix QueryFailedError when logging user's IPs - +* fix QueryFailedError when logging user's IPs + * use `orIgnore` to fix - Fix(client): fix style of mention @@ -7196,25 +8062,25 @@ Fix #8878 - Fix(sw, notification): Don't issue an event if there is no affect ([#8979](https://github.com/orhun/git-cliff/issues/8979)) -* test - +* test + * ]v] - Fix: add `es2017` build target ([#8931](https://github.com/orhun/git-cliff/issues/8931)) -* remove top level awaits - -* add es2017 target - +* remove top level awaits + +* add es2017 target + * refactor: use setup and ref sugar - Fix(client): hide bot protection warning with disabled registrations ([#8794](https://github.com/orhun/git-cliff/issues/8794)) -* fix(client): hide bot protection warning with disabled registrations - -* Apply review suggestion from @Johann150 - -Co-authored-by: Johann150 <johann@qwertqwefsday.eu> - -Co-authored-by: Johann150 <johann@qwertqwefsday.eu> +* fix(client): hide bot protection warning with disabled registrations + +* Apply review suggestion from @Johann150 + +Co-authored-by: Johann150 <johann@qwertqwefsday.eu> + +Co-authored-by: Johann150 <johann@qwertqwefsday.eu> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Fix @@ -7267,11 +8133,11 @@ Fix #8474 - Docs(readme): add Greenkeeper badge - Docs to run in production mode ([#4347](https://github.com/orhun/git-cliff/issues/4347)) -* run in production mode from systemd - -* NODE_ENV=production npm run build - -* npm start +* run in production mode from systemd + +* NODE_ENV=production npm run build + +* npm start - Docs @@ -7322,20 +8188,20 @@ Fix #8474 - Add an endpoint users/lists/update ([#2585](https://github.com/orhun/git-cliff/issues/2585)) -* add an endpoint users/lists/update - -* add meta params - -* fix packing +* add an endpoint users/lists/update + +* add meta params + +* fix packing - Adds ko-KR な to にゃ ([#3820](https://github.com/orhun/git-cliff/issues/3820)) -* adds ko-KR な to にゃ -- this only take considers pre-composed "Hangul Syllables", -not composable area "Hangul Jamo" which are not used commonly -- 56 is '냐' - '나' - -* replace magic number as suggested +* adds ko-KR な to にゃ +- this only take considers pre-composed "Hangul Syllables", +not composable area "Hangul Jamo" which are not used commonly +- 56 is '냐' - '나' + +* replace magic number as suggested - ✨🌎✨ A federated blogging platform ✨🚀✨ @@ -7385,142 +8251,142 @@ Resolve #5819 - Feat(client): 翻訳をIndexedDBに保存・プッシュ通知を翻訳 ([#6396](https://github.com/orhun/git-cliff/issues/6396)) -* wip - -* tabun ok - -* better msg - -* oops - -* fix lint - -* Update gulpfile.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* Update src/client/scripts/set-i18n-contexts.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* refactor - -Co-authored-by: acid-chicken <root@acid-chicken.com> - -* ✨ - -* wip - -* fix lint - -* たぶんおk - -* fix flush - -* Translate Notification - -* remove console.log - -* fix - -* add notifications - -* remove san - -* wip - -* ok - -* :v: - -* Update src/prelude/array.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* wip - -* i18n refactor - -* Update init.ts - -* :v: - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> +* wip + +* tabun ok + +* better msg + +* oops + +* fix lint + +* Update gulpfile.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* Update src/client/scripts/set-i18n-contexts.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* refactor + +Co-authored-by: acid-chicken <root@acid-chicken.com> + +* ✨ + +* wip + +* fix lint + +* たぶんおk + +* fix flush + +* Translate Notification + +* remove console.log + +* fix + +* add notifications + +* remove san + +* wip + +* ok + +* :v: + +* Update src/prelude/array.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* wip + +* i18n refactor + +* Update init.ts + +* :v: + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <syuilotan@yahoo.co.jp> - Feat(client): 自動でもっと見るオプション ([#6403](https://github.com/orhun/git-cliff/issues/6403)) -* wip - -* ugokanai - -* wip - -* implement setting subscribing - -* fix lint - -* :v: - -* Update notifications.vue - +* wip + +* ugokanai + +* wip + +* implement setting subscribing + +* fix lint + +* :v: + +* Update notifications.vue + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat(client): Convert text mfm node to text (v)dom node instead of span tag ([#6399](https://github.com/orhun/git-cliff/issues/6399)) -* Convert text mfm node to text (v)dom node -instead of span tag - -* Update mfm.ts - +* Convert text mfm node to text (v)dom node +instead of span tag + +* Update mfm.ts + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat(client): 投稿フォームのボタンの説明を表示するように ([#6408](https://github.com/orhun/git-cliff/issues/6408)) -* Add title attr with buttons on the post form - -* fix - -* tooltip - -* missing ; - -* remove title attr - -* fix bug - -* Update reactions-viewer.details.vue - -* help wip - -* ok! - -* i18n - +* Add title attr with buttons on the post form + +* fix + +* tooltip + +* missing ; + +* remove title attr + +* fix bug + +* Update reactions-viewer.details.vue + +* help wip + +* ok! + +* i18n + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat: Observe notification read and fix #6406 ([#6407](https://github.com/orhun/git-cliff/issues/6407)) -* Resolve https://github.com/syuilo/misskey/pull/6406#issuecomment-633203670 - -* Improve typing - -* Observe notification read - -* capture readAllNotifications - -* fix - -* fix - -* Refactor - -* Update src/client/components/notification.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* Update src/client/components/notification.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* missing ; - +* Resolve https://github.com/syuilo/misskey/pull/6406#issuecomment-633203670 + +* Improve typing + +* Observe notification read + +* capture readAllNotifications + +* fix + +* fix + +* Refactor + +* Update src/client/components/notification.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* Update src/client/components/notification.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* missing ; + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat(theme): Add mentionMe property @@ -7564,10 +8430,10 @@ Resolve #6544 - Feat(server): Fetch icon url of an instance ([#6591](https://github.com/orhun/git-cliff/issues/6591)) -* feat(server): Fetch icon url of an instance - -Resolve #6589 - +* feat(server): Fetch icon url of an instance + +Resolve #6589 + * chore: Rename the function - Feat(client): Display instance icon @@ -7616,46 +8482,46 @@ Resolve #5213 - Feat: Implement api sw/unregister ([#7611](https://github.com/orhun/git-cliff/issues/7611)) -* Implement api sw/unregister - -* remove all mode - -* add changelog - +* Implement api sw/unregister + +* remove all mode + +* add changelog + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Add setting to keep content warning ([#7682](https://github.com/orhun/git-cliff/issues/7682)) - Feat: リモートからユーザー削除が飛んできたら削除するように ([#7768](https://github.com/orhun/git-cliff/issues/7768)) -* Delete Actor - -* Update src/remote/activitypub/kernel/delete/actor.ts - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - +* Delete Actor + +* Update src/remote/activitypub/kernel/delete/actor.ts + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Add sponsors section - Add resolver check for blocked instance ([#7777](https://github.com/orhun/git-cliff/issues/7777)) -* add resolver check for blocked instance - -* lint - +* add resolver check for blocked instance + +* lint + * Update note.ts - Feat: 凍結された場合のダイアログを実装 ([#7811](https://github.com/orhun/git-cliff/issues/7811)) -* feat: 凍結された場合のダイアログを実装 - -* Update CHANGELOG.md - -* Update basic.js - -* improve error handling - -* cypressなんもわからん - +* feat: 凍結された場合のダイアログを実装 + +* Update CHANGELOG.md + +* Update basic.js + +* improve error handling + +* cypressなんもわからん + * Update basic.js - Feat(server): 管理者用アカウント削除API実装 @@ -7664,29 +8530,29 @@ Resolve #7735 - Feat: MFM Sparkle animation ([#7813](https://github.com/orhun/git-cliff/issues/7813)) -* Add sparkle mfm animation ✨ - -* Cleanup sparkle effect - -+ spaces -> tabs and other codestyle -+ use proper image -+ listen for resizes +* Add sparkle mfm animation ✨ + +* Cleanup sparkle effect + ++ spaces -> tabs and other codestyle ++ use proper image ++ listen for resizes + use font-size to determine particle size (for fun with x2/3/4 stacking) - Feat(client): MFM関数構文のサジェストを実装 - Add todo - Feat: アカウント作成にメールアドレス必須にするオプション ([#7856](https://github.com/orhun/git-cliff/issues/7856)) -* feat: アカウント作成にメールアドレス必須にするオプション - -* ui - -* fix bug - -* fix bug - -* fix bug - +* feat: アカウント作成にメールアドレス必須にするオプション + +* ui + +* fix bug + +* fix bug + +* fix bug + * :art: - Feat: 未読の通知のみ表示する機能 @@ -7698,18 +8564,18 @@ Resolve #7735 - Feat: ノートプレビューを追加 ([#7596](https://github.com/orhun/git-cliff/issues/7596)) -* add note preview - -* use if - -* add draftedNote property - -* custom emojis work - -* Only show CW on preview when enabled - -* move button to top - +* add note preview + +* use if + +* add draftedNote property + +* custom emojis work + +* Only show CW on preview when enabled + +* move button to top + * fix css style - Feat(api): add users/groups/leave @@ -7733,21 +8599,21 @@ Close #7808 - Feat: thread mute ([#7930](https://github.com/orhun/git-cliff/issues/7930)) -* feat: thread mute - -* chore: fix comment - -* fix test - -* fix - +* feat: thread mute + +* chore: fix comment + +* fix test + +* fix + * refactor - Feat: クライアントでログインするアカウントidを指定するクエリ(loginId=:userId) ([#7929](https://github.com/orhun/git-cliff/issues/7929)) -* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 - -* await? - +* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 + +* await? + * rename - Add some locales @@ -7755,16 +8621,16 @@ Resolve #7940 - Feat: make possible to configure following/followers visibility ([#7959](https://github.com/orhun/git-cliff/issues/7959)) -* feat: make possible to configure following/followers visibility - -* add test - -* ap - -* add ap test - -* set Cache-Control - +* feat: make possible to configure following/followers visibility + +* add test + +* ap + +* add ap test + +* set Cache-Control + * hide following/followers count - Feat: improve email validation @@ -7798,85 +8664,85 @@ Resolve #7025 - Feat: Undo Accept ([#7980](https://github.com/orhun/git-cliff/issues/7980)) -* allow breaking of follow - -* send undo - +* allow breaking of follow + +* send undo + * delete by using reject follow - Add note - Feat: user-level instance mute ([#7712](https://github.com/orhun/git-cliff/issues/7712)) -* Update ja-JP.yml - -* Added settable config for muted instances - -* added psql query for removal of muted notes - -* Added filtering and trimming for instance mutes - -* cleaned up filtering of bad instance mutes and added a refresh at the end for the list on the client - -* Added notification & streaming timeline muting - -* Updated changelog - -* Added missing semicolon - -* Apply japanese string suggestions from robflop - -Co-authored-by: Robin B. <robflop98@outlook.com> - -* Changed Ja-JP instance mute title string to one suggested by sousuke - -Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> - -* Update ja-JP instanceMuteDescription based on sousuke's suggestion - -Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> - -* added notification mute - -* added notification and note children muting - -* Fixed a bug where local notifications were getting filtered on cold start - -* Fixed instance mute imports - -* Fixed not saving/loading instance mutes - -* removed en-US translations for instance mute - -* moved instance mute migration to js - -* changed settings index back to spaces - -* removed destructuring assignment from notification stream in instance mute check call - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> - -* added .note accessor for checking note data instead of notification data - -* changed note to use Packed<'Note'> instead of any and removed usage of snake case - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> - -* changed notification mute check to check specifically for notification host - -* changed to using single quotes - -* moved @click to the end for the linter - -* revert unnecessary changes - -* restored newlines - -* whitespace removal - -Co-authored-by: syuilo <syuilotan@yahoo.co.jp> -Co-authored-by: Robin B. <robflop98@outlook.com> -Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> -Co-authored-by: puffaboo <emilis@jigglypuff.club> +* Update ja-JP.yml + +* Added settable config for muted instances + +* added psql query for removal of muted notes + +* Added filtering and trimming for instance mutes + +* cleaned up filtering of bad instance mutes and added a refresh at the end for the list on the client + +* Added notification & streaming timeline muting + +* Updated changelog + +* Added missing semicolon + +* Apply japanese string suggestions from robflop + +Co-authored-by: Robin B. <robflop98@outlook.com> + +* Changed Ja-JP instance mute title string to one suggested by sousuke + +Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> + +* Update ja-JP instanceMuteDescription based on sousuke's suggestion + +Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> + +* added notification mute + +* added notification and note children muting + +* Fixed a bug where local notifications were getting filtered on cold start + +* Fixed instance mute imports + +* Fixed not saving/loading instance mutes + +* removed en-US translations for instance mute + +* moved instance mute migration to js + +* changed settings index back to spaces + +* removed destructuring assignment from notification stream in instance mute check call + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> + +* added .note accessor for checking note data instead of notification data + +* changed note to use Packed<'Note'> instead of any and removed usage of snake case + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> + +* changed notification mute check to check specifically for notification host + +* changed to using single quotes + +* moved @click to the end for the linter + +* revert unnecessary changes + +* restored newlines + +* whitespace removal + +Co-authored-by: syuilo <syuilotan@yahoo.co.jp> +Co-authored-by: Robin B. <robflop98@outlook.com> +Co-authored-by: sousuke0422 <sousuke20xx@gmail.com> +Co-authored-by: puffaboo <emilis@jigglypuff.club> Co-authored-by: tamaina <tamaina@hotmail.co.jp> - Feat: improve follow export @@ -7912,8 +8778,8 @@ Resolve #8231 - Feat: Option to show replies in timeline ([#7685](https://github.com/orhun/git-cliff/issues/7685)) ([#8202](https://github.com/orhun/git-cliff/issues/8202)) -* Add an option for timeline replies. Credit to Emilis (puffaboo) - +* Add an option for timeline replies. Credit to Emilis (puffaboo) + * update db on request - Feat(client): 自インスタンス情報ページでチャートを見れるように @@ -7958,14 +8824,14 @@ Resolve #4664 - Feat: Webhook ([#8457](https://github.com/orhun/git-cliff/issues/8457)) -* feat: introduce webhook - -* wip - -* wip - -* wip - +* feat: introduce webhook + +* wip + +* wip + +* wip + * Update CHANGELOG.md - Add x,y parameters to rotate MFM @@ -7973,270 +8839,270 @@ Resolve #4664 - Feat: Improve Push Notification ([#7667](https://github.com/orhun/git-cliff/issues/7667)) -* clean up - -* ev => data - -* refactor - -* clean up - -* add type - -* antenna - -* channel - -* fix - -* add Packed type - -* add PackedRef - -* fix lint - -* add emoji schema - -* add reversiGame - -* add reversiMatching - -* remove signin schema (use Signin entity) - -* add schemas refs, fix Packed type - -* wip PackedHoge => Packed<'Hoge'> - -* add Packed type - -* note-reaction - -* user - -* user-group - -* user-list - -* note - -* app, messaging-message - -* notification - -* drive-file - -* drive-folder - -* following - -* muting - -* blocking - -* hashtag - -* page - -* app (with modifying schema) - -* import user? - -* channel - -* antenna - -* clip - -* gallery-post - -* emoji - -* Packed - -* reversi-matching - -* update stream.ts - -* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 - -* fix lint - -* clean up? - -* add app - -* fix - -* nanka iroiro - -* wip - -* wip - -* fix lint - -* fix loginId - -* fix - -* refactor - -* refactor - -* remove follow action - -* clean up - -* Revert "remove follow action" - -This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. - -* Revert "clean up" - -This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. - -* remove fetch specification - -* renoteの条件追加 - -* apiFetch => cli - -* bypass fetch? - -* fix - -* refactor: use path alias - -* temp: add submodule - -* remove submodule - -* enhane: unison-reloadに指定したパスに移動できるように - -* null - -* null - -* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 - -* null - -* await? - -* rename - -* rename - -* Update read.ts - -* merge - -* get-note-summary - -* fix - -* swパッケージに - -* add missing packages - -* fix getNoteSummary - -* add webpack-cli - -* :v: - -* remove plugins - -* sw-inject分離したがテストしてない - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix - -* :v: - -* clean up config - -* typesを戻した - -* Update packages/client/src/components/notification.vue - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* disconnect - -* oops - -* Failed to load the script unexpectedly回避 -sw.jsとlib.tsを分離してみた - -* truncate notification - -* Update packages/client/src/ui/_common_/common.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* clean up - -* clean up - -* キャッシュ対策 - -* Truncate push notification message - -* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 - -* components/drive-file-thumbnail.vue - -* components/drive-select-dialog.vue - -* components/drive-window.vue - -* merge - -* fix - -* Service Workerのビルドにesbuildを使うようにする - -* return createEmptyNotification() - -* fix - -* i18n.ts - -* update - -* :v: - -* remove ts-loader - -* fix - -* fix - -* enhance: Service Workerを常に登録するように - -* pollEnded - -* URLをsw.jsに戻す - -* clean up - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> +* clean up + +* ev => data + +* refactor + +* clean up + +* add type + +* antenna + +* channel + +* fix + +* add Packed type + +* add PackedRef + +* fix lint + +* add emoji schema + +* add reversiGame + +* add reversiMatching + +* remove signin schema (use Signin entity) + +* add schemas refs, fix Packed type + +* wip PackedHoge => Packed<'Hoge'> + +* add Packed type + +* note-reaction + +* user + +* user-group + +* user-list + +* note + +* app, messaging-message + +* notification + +* drive-file + +* drive-folder + +* following + +* muting + +* blocking + +* hashtag + +* page + +* app (with modifying schema) + +* import user? + +* channel + +* antenna + +* clip + +* gallery-post + +* emoji + +* Packed + +* reversi-matching + +* update stream.ts + +* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 + +* fix lint + +* clean up? + +* add app + +* fix + +* nanka iroiro + +* wip + +* wip + +* fix lint + +* fix loginId + +* fix + +* refactor + +* refactor + +* remove follow action + +* clean up + +* Revert "remove follow action" + +This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. + +* Revert "clean up" + +This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. + +* remove fetch specification + +* renoteの条件追加 + +* apiFetch => cli + +* bypass fetch? + +* fix + +* refactor: use path alias + +* temp: add submodule + +* remove submodule + +* enhane: unison-reloadに指定したパスに移動できるように + +* null + +* null + +* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 + +* null + +* await? + +* rename + +* rename + +* Update read.ts + +* merge + +* get-note-summary + +* fix + +* swパッケージに + +* add missing packages + +* fix getNoteSummary + +* add webpack-cli + +* :v: + +* remove plugins + +* sw-inject分離したがテストしてない + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix + +* :v: + +* clean up config + +* typesを戻した + +* Update packages/client/src/components/notification.vue + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* disconnect + +* oops + +* Failed to load the script unexpectedly回避 +sw.jsとlib.tsを分離してみた + +* truncate notification + +* Update packages/client/src/ui/_common_/common.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* clean up + +* clean up + +* キャッシュ対策 + +* Truncate push notification message + +* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 + +* components/drive-file-thumbnail.vue + +* components/drive-select-dialog.vue + +* components/drive-window.vue + +* merge + +* fix + +* Service Workerのビルドにesbuildを使うようにする + +* return createEmptyNotification() + +* fix + +* i18n.ts + +* update + +* :v: + +* remove ts-loader + +* fix + +* fix + +* enhance: Service Workerを常に登録するように + +* pollEnded + +* URLをsw.jsに戻す + +* clean up + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat: make captcha required when signin to improve security @@ -8249,52 +9115,52 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> Highlight PRs that edit locales other than the ja-JP one so the author may see and fix it themselves. - Feat(tests): add e2e tests for widgets ([#8735](https://github.com/orhun/git-cliff/issues/8735)) -* test(e2e): add baseline for widget tests - -* chore(repo): enable test running in branch - -* fix(e2e): set viewport for widget tests - -* fix(client): add widget identifier classes to widgets - -* test(e2e): add memo widget test - -* fix(tests): force select value - -* fix(tests): force button press for widget addition - -* fix(tests): invoke select value differently - -* fix(tests): adjust widget submit - -* fix(tests): don't explicitly navigate for widget test - -* fix(tests): click label to hide select popup - -* fix(tests): just click modal background - -* fix(tests): adjust modal background selector - -* fix(tests): click all modal backgrounds - -* feat(e2e): add test for adding timeline widget - -* fix(client): add more widget identifier classes - -* feat(tests): add method abstraction for test cases - -* fix(tests): force-click overlays - -* fix(tests): force widget button press - -* fix(tests): remove timeout from final widget check - -* feat(tests): add widget removal test case - -* fix(client): use mk instead of msky as class prefix - -* fix(tests): check widgets for existence rather than visibility - +* test(e2e): add baseline for widget tests + +* chore(repo): enable test running in branch + +* fix(e2e): set viewport for widget tests + +* fix(client): add widget identifier classes to widgets + +* test(e2e): add memo widget test + +* fix(tests): force select value + +* fix(tests): force button press for widget addition + +* fix(tests): invoke select value differently + +* fix(tests): adjust widget submit + +* fix(tests): don't explicitly navigate for widget test + +* fix(tests): click label to hide select popup + +* fix(tests): just click modal background + +* fix(tests): adjust modal background selector + +* fix(tests): click all modal backgrounds + +* feat(e2e): add test for adding timeline widget + +* fix(client): add more widget identifier classes + +* feat(tests): add method abstraction for test cases + +* fix(tests): force-click overlays + +* fix(tests): force widget button press + +* fix(tests): remove timeout from final widget check + +* feat(tests): add widget removal test case + +* fix(client): use mk instead of msky as class prefix + +* fix(tests): check widgets for existence rather than visibility + * chore(meta): don't run tests for specific feature branch - Add @rollup/pluginutils @@ -8304,236 +9170,236 @@ Co-authored-by: acid-chicken <root@acid-chicken.com> - Feat: option to collapse long notes ([#8561](https://github.com/orhun/git-cliff/issues/8561)) -* feat: option to collapse long notes - -Closes #8559 - -* do not collapse if cw exists - -* use '閉じる' to close / show less. - -* make it sticky - +* feat: option to collapse long notes + +Closes #8559 + +* do not collapse if cw exists + +* use '閉じる' to close / show less. + +* make it sticky + * Change style of the Show less button - Add packageExtensions - Feat: image cropping ([#8808](https://github.com/orhun/git-cliff/issues/8808)) -* wip - -* wip - +* wip + +* wip + * wip - Feat: Add Badge Image to Push Notification ([#8012](https://github.com/orhun/git-cliff/issues/8012)) -* fix - -* nanka iroiro - -* wip - -* wip - -* fix lint - -* fix loginId - -* fix - -* refactor - -* refactor - -* remove follow action - -* clean up - -* Revert "remove follow action" - -This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. - -* Revert "clean up" - -This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. - -* remove fetch specification - -* renoteの条件追加 - -* apiFetch => cli - -* bypass fetch? - -* fix - -* refactor: use path alias - -* temp: add submodule - -* remove submodule - -* enhane: unison-reloadに指定したパスに移動できるように - -* null - -* null - -* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 - -* null - -* await? - -* rename - -* rename - -* Update read.ts - -* merge - -* get-note-summary - -* fix - -* swパッケージに - -* add missing packages - -* fix getNoteSummary - -* add webpack-cli - -* :v: - -* remove plugins - -* sw-inject分離したがテストしてない - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix - -* :v: - -* clean up config - -* typesを戻した - -* backend/src/web/index.ts - -* notification-badges - -* add scripts - -* change create-notification.ts - -* Update packages/client/src/components/notification.vue - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* disconnect - -* oops - -* Failed to load the script unexpectedly回避 -sw.jsとlib.tsを分離してみた - -* truncate notification - -* Update packages/client/src/ui/_common_/common.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* clean up - -* clean up - -* refactor - -* キャッシュ対策 - -* Truncate push notification message - -* fix - -* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 - -* components/drive-file-thumbnail.vue - -* components/drive-select-dialog.vue - -* components/drive-window.vue - -* merge - -* fix - -* Service Workerのビルドにesbuildを使うようにする - -* return createEmptyNotification() - -* fix - -* fix - -* i18n.ts - -* update - -* :v: - -* remove ts-loader - -* fix - -* fix - -* enhance: Service Workerを常に登録するように - -* pollEnded - -* pollEnded - -* URLをsw.jsに戻す - -* clean up - -* fix lint - -* changelog - -* alpha-test - -* also with twemoji - -* add isMimeImage function - -* catch - -* Colour => Color - -* char2file => char2filePath - -* Update autocomplete.vue - -* remove clone? - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> +* fix + +* nanka iroiro + +* wip + +* wip + +* fix lint + +* fix loginId + +* fix + +* refactor + +* refactor + +* remove follow action + +* clean up + +* Revert "remove follow action" + +This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. + +* Revert "clean up" + +This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. + +* remove fetch specification + +* renoteの条件追加 + +* apiFetch => cli + +* bypass fetch? + +* fix + +* refactor: use path alias + +* temp: add submodule + +* remove submodule + +* enhane: unison-reloadに指定したパスに移動できるように + +* null + +* null + +* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 + +* null + +* await? + +* rename + +* rename + +* Update read.ts + +* merge + +* get-note-summary + +* fix + +* swパッケージに + +* add missing packages + +* fix getNoteSummary + +* add webpack-cli + +* :v: + +* remove plugins + +* sw-inject分離したがテストしてない + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix + +* :v: + +* clean up config + +* typesを戻した + +* backend/src/web/index.ts + +* notification-badges + +* add scripts + +* change create-notification.ts + +* Update packages/client/src/components/notification.vue + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* disconnect + +* oops + +* Failed to load the script unexpectedly回避 +sw.jsとlib.tsを分離してみた + +* truncate notification + +* Update packages/client/src/ui/_common_/common.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* clean up + +* clean up + +* refactor + +* キャッシュ対策 + +* Truncate push notification message + +* fix + +* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 + +* components/drive-file-thumbnail.vue + +* components/drive-select-dialog.vue + +* components/drive-window.vue + +* merge + +* fix + +* Service Workerのビルドにesbuildを使うようにする + +* return createEmptyNotification() + +* fix + +* fix + +* i18n.ts + +* update + +* :v: + +* remove ts-loader + +* fix + +* fix + +* enhance: Service Workerを常に登録するように + +* pollEnded + +* pollEnded + +* URLをsw.jsに戻す + +* clean up + +* fix lint + +* changelog + +* alpha-test + +* also with twemoji + +* add isMimeImage function + +* catch + +* Colour => Color + +* char2file => char2filePath + +* Update autocomplete.vue + +* remove clone? + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Feat: 管理者が特定ユーザーのアップロードしたファイル一覧を見れるように @@ -8559,22 +9425,22 @@ Resolve #8830 - Feat: Log user ips ([#8872](https://github.com/orhun/git-cliff/issues/8872)) -* wip - -* store ip and headers - -* Update admin-file.vue - -* require admin for view ip/headers - -* IP (recent) 消した - -* admin必須 - -* opt in - -* clean ips periodically - +* wip + +* store ip and headers + +* Update admin-file.vue + +* require admin for view ip/headers + +* IP (recent) 消した + +* admin必須 + +* opt in + +* clean ips periodically + * respect logging setting in drive/files/create - Feature(client): Timeline page for non-login users - Feat(server): add fetch-rss api to reduce dependency of external apis @@ -8585,85 +9451,85 @@ Resolve #8830 - Feat: styled error screen ([#8930](https://github.com/orhun/git-cliff/issues/8930)) -* Styled error screen - -* Make details margin auto - -* Update boot.css - -* Replace fontawesome with tabler svg - -* Remove hr - -* Add new style to flush screen - +* Styled error screen + +* Make details margin auto + +* Update boot.css + +* Replace fontawesome with tabler svg + +* Remove hr + +* Add new style to flush screen + * Rename to `error.css` - Feat(client): メニューからページをリロードできるように - Feat: auto nsfw detection ([#8840](https://github.com/orhun/git-cliff/issues/8840)) -* feat: auto nsfw detection - -* :v: - -* Update ja-JP.yml - -* Update ja-JP.yml - -* ポルノ判定のしきい値を高めに - -* エラーハンドリングちゃんとした - -* Update ja-JP.yml - -* 感度設定を強化 - -* refactor - -* feat: add video support for auto nsfw detection - -* rename: image -> media - -* .js - -* fix: add missing error handling - -* fix: use valid pathname instead of using filename due to invalid usage - -* perf(nsfw-detection): decode frames - -* disable detection of video for some reasons - -* perf(nsfw-detection): streamify detection process for video - -* disable disallowUploadWhenPredictedAsPorn option - -* fix(nsfw-detection): improve reliability - -* fix(nsfw-detection): use Math.ceil instead of Math.round - -* perf(nsfw-detection): delete tmp frames after used - -* fix(nsfw-detection): FSWatcher does not emit ready event - -* perf(nsfw-detection): skip black frames - -* refactor: strip exists check - -* Update package.json - -* めっちゃ変えた - -* lint - -* Update COPYING - -* オプションで動画解析できるように - -* Update yarn.lock - -* Update CHANGELOG.md - +* feat: auto nsfw detection + +* :v: + +* Update ja-JP.yml + +* Update ja-JP.yml + +* ポルノ判定のしきい値を高めに + +* エラーハンドリングちゃんとした + +* Update ja-JP.yml + +* 感度設定を強化 + +* refactor + +* feat: add video support for auto nsfw detection + +* rename: image -> media + +* .js + +* fix: add missing error handling + +* fix: use valid pathname instead of using filename due to invalid usage + +* perf(nsfw-detection): decode frames + +* disable detection of video for some reasons + +* perf(nsfw-detection): streamify detection process for video + +* disable disallowUploadWhenPredictedAsPorn option + +* fix(nsfw-detection): improve reliability + +* fix(nsfw-detection): use Math.ceil instead of Math.round + +* perf(nsfw-detection): delete tmp frames after used + +* fix(nsfw-detection): FSWatcher does not emit ready event + +* perf(nsfw-detection): skip black frames + +* refactor: strip exists check + +* Update package.json + +* めっちゃ変えた + +* lint + +* Update COPYING + +* オプションで動画解析できるように + +* Update yarn.lock + +* Update CHANGELOG.md + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Feat: support <plain> syntax for mfm @@ -9226,16 +10092,16 @@ Fix #6418 - Update page editor ([#7317](https://github.com/orhun/git-cliff/issues/7317)) -* fix buttons visibility +* fix buttons visibility * fix title of page editor - Update mfm.js ([#7435](https://github.com/orhun/git-cliff/issues/7435)) -* use mfm.js 0.14.0 - -* use mfm.extract - -* use mfm.extract - +* use mfm.js 0.14.0 + +* use mfm.extract + +* use mfm.extract + * use mfm.extract - Update mfm-js @@ -9271,31 +10137,31 @@ Fix #6418 - Chore: APIドキュメントの修正 ([#7771](https://github.com/orhun/git-cliff/issues/7771)) -* packedNotificationSchemaを更新 - -* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 - -* fix - +* packedNotificationSchemaを更新 + +* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 + +* fix + * add header, choice, invitation - Chore: .configをdockerイメージに入れないように ([#7625](https://github.com/orhun/git-cliff/issues/7625)) -* .configをdockerイメージに入れないように - -* Update docker-compose.yml - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> - -Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> +* .configをdockerイメージに入れないように + +* Update docker-compose.yml + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> + +Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> Co-authored-by: tamaina <tamaina@hotmail.co.jp> - Update deps - Chore, perf: Reduce redis memory ([#7816](https://github.com/orhun/git-cliff/issues/7816)) -* Reduce redis memory - -* CHANGELOG - +* Reduce redis memory + +* CHANGELOG + * a - Update contribution guide @@ -9375,20 +10241,20 @@ Close #7924 - Chore(deps-dev): bump cypress from 9.3.1 to 9.4.1 ([#8239](https://github.com/orhun/git-cliff/issues/8239)) -Bumps [cypress](https://github.com/cypress-io/cypress) from 9.3.1 to 9.4.1. -- [Release notes](https://github.com/cypress-io/cypress/releases) -- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js) -- [Commits](https://github.com/cypress-io/cypress/compare/v9.3.1...v9.4.1) - ---- -updated-dependencies: -- dependency-name: cypress - dependency-type: direct:development - update-type: version-update:semver-minor -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [cypress](https://github.com/cypress-io/cypress) from 9.3.1 to 9.4.1. +- [Release notes](https://github.com/cypress-io/cypress/releases) +- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js) +- [Commits](https://github.com/cypress-io/cypress/compare/v9.3.1...v9.4.1) + +--- +updated-dependencies: +- dependency-name: cypress + dependency-type: direct:development + update-type: version-update:semver-minor +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps @@ -9402,175 +10268,175 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump axios from 0.21.1 to 0.21.4 in /packages/client ([#8286](https://github.com/orhun/git-cliff/issues/8286)) -Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. -- [Release notes](https://github.com/axios/axios/releases) -- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) -- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) - ---- -updated-dependencies: -- dependency-name: axios - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. +- [Release notes](https://github.com/axios/axios/releases) +- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) +- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) + +--- +updated-dependencies: +- dependency-name: axios + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump path-parse from 1.0.6 to 1.0.7 in /packages/client ([#8288](https://github.com/orhun/git-cliff/issues/8288)) -Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. -- [Release notes](https://github.com/jbgutierrez/path-parse/releases) -- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) - ---- -updated-dependencies: -- dependency-name: path-parse - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. +- [Release notes](https://github.com/jbgutierrez/path-parse/releases) +- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) + +--- +updated-dependencies: +- dependency-name: path-parse + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump glob-parent from 5.1.1 to 5.1.2 in /packages/client ([#8289](https://github.com/orhun/git-cliff/issues/8289)) -Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. -- [Release notes](https://github.com/gulpjs/glob-parent/releases) -- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) -- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) - ---- -updated-dependencies: -- dependency-name: glob-parent - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. +- [Release notes](https://github.com/gulpjs/glob-parent/releases) +- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) +- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) + +--- +updated-dependencies: +- dependency-name: glob-parent + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump simple-get from 4.0.0 to 4.0.1 in /packages/backend ([#8292](https://github.com/orhun/git-cliff/issues/8292)) -Bumps [simple-get](https://github.com/feross/simple-get) from 4.0.0 to 4.0.1. -- [Release notes](https://github.com/feross/simple-get/releases) -- [Commits](https://github.com/feross/simple-get/compare/v4.0.0...v4.0.1) - ---- -updated-dependencies: -- dependency-name: simple-get - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [simple-get](https://github.com/feross/simple-get) from 4.0.0 to 4.0.1. +- [Release notes](https://github.com/feross/simple-get/releases) +- [Commits](https://github.com/feross/simple-get/compare/v4.0.0...v4.0.1) + +--- +updated-dependencies: +- dependency-name: simple-get + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump node-fetch from 2.6.1 to 2.6.7 in /packages/client ([#8291](https://github.com/orhun/git-cliff/issues/8291)) -Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. -- [Release notes](https://github.com/node-fetch/node-fetch/releases) -- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) - ---- -updated-dependencies: -- dependency-name: node-fetch - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. +- [Release notes](https://github.com/node-fetch/node-fetch/releases) +- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) + +--- +updated-dependencies: +- dependency-name: node-fetch + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump node-fetch from 2.6.1 to 2.6.7 in /packages/backend ([#8293](https://github.com/orhun/git-cliff/issues/8293)) -Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. -- [Release notes](https://github.com/node-fetch/node-fetch/releases) -- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) - ---- -updated-dependencies: -- dependency-name: node-fetch - dependency-type: direct:production -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. +- [Release notes](https://github.com/node-fetch/node-fetch/releases) +- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) + +--- +updated-dependencies: +- dependency-name: node-fetch + dependency-type: direct:production +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump browserslist from 4.16.3 to 4.19.1 in /packages/client ([#8290](https://github.com/orhun/git-cliff/issues/8290)) -Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.16.3 to 4.19.1. -- [Release notes](https://github.com/browserslist/browserslist/releases) -- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) -- [Commits](https://github.com/browserslist/browserslist/compare/4.16.3...4.19.1) - ---- -updated-dependencies: -- dependency-name: browserslist - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.16.3 to 4.19.1. +- [Release notes](https://github.com/browserslist/browserslist/releases) +- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) +- [Commits](https://github.com/browserslist/browserslist/compare/4.16.3...4.19.1) + +--- +updated-dependencies: +- dependency-name: browserslist + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak chart - Chore(deps): bump tar from 6.0.5 to 6.1.11 in /packages/backend ([#8294](https://github.com/orhun/git-cliff/issues/8294)) -Bumps [tar](https://github.com/npm/node-tar) from 6.0.5 to 6.1.11. -- [Release notes](https://github.com/npm/node-tar/releases) -- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md) -- [Commits](https://github.com/npm/node-tar/compare/v6.0.5...v6.1.11) - ---- -updated-dependencies: -- dependency-name: tar - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [tar](https://github.com/npm/node-tar) from 6.0.5 to 6.1.11. +- [Release notes](https://github.com/npm/node-tar/releases) +- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md) +- [Commits](https://github.com/npm/node-tar/compare/v6.0.5...v6.1.11) + +--- +updated-dependencies: +- dependency-name: tar + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump path-parse from 1.0.6 to 1.0.7 in /packages/backend ([#8301](https://github.com/orhun/git-cliff/issues/8301)) -Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. -- [Release notes](https://github.com/jbgutierrez/path-parse/releases) -- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) - ---- -updated-dependencies: -- dependency-name: path-parse - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. +- [Release notes](https://github.com/jbgutierrez/path-parse/releases) +- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) + +--- +updated-dependencies: +- dependency-name: path-parse + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump normalize-url from 4.5.0 to 4.5.1 in /packages/backend ([#8302](https://github.com/orhun/git-cliff/issues/8302)) -Bumps [normalize-url](https://github.com/sindresorhus/normalize-url) from 4.5.0 to 4.5.1. -- [Release notes](https://github.com/sindresorhus/normalize-url/releases) -- [Commits](https://github.com/sindresorhus/normalize-url/commits) - ---- -updated-dependencies: -- dependency-name: normalize-url - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [normalize-url](https://github.com/sindresorhus/normalize-url) from 4.5.0 to 4.5.1. +- [Release notes](https://github.com/sindresorhus/normalize-url/releases) +- [Commits](https://github.com/sindresorhus/normalize-url/commits) + +--- +updated-dependencies: +- dependency-name: normalize-url + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump glob-parent from 5.1.1 to 5.1.2 in /packages/backend ([#8303](https://github.com/orhun/git-cliff/issues/8303)) -Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. -- [Release notes](https://github.com/gulpjs/glob-parent/releases) -- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) -- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) - ---- -updated-dependencies: -- dependency-name: glob-parent - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2. +- [Release notes](https://github.com/gulpjs/glob-parent/releases) +- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md) +- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) + +--- +updated-dependencies: +- dependency-name: glob-parent + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps @@ -9592,80 +10458,80 @@ Close #8327 - Chore(deps): bump minimist from 1.2.5 to 1.2.6 in /packages/backend ([#8447](https://github.com/orhun/git-cliff/issues/8447)) -Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. -- [Release notes](https://github.com/substack/minimist/releases) -- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) - ---- -updated-dependencies: -- dependency-name: minimist - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. +- [Release notes](https://github.com/substack/minimist/releases) +- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) + +--- +updated-dependencies: +- dependency-name: minimist + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps - Chore(deps): bump minimist from 1.2.5 to 1.2.6 in /packages/client ([#8446](https://github.com/orhun/git-cliff/issues/8446)) -Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. -- [Release notes](https://github.com/substack/minimist/releases) -- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) - ---- -updated-dependencies: -- dependency-name: minimist - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. +- [Release notes](https://github.com/substack/minimist/releases) +- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) + +--- +updated-dependencies: +- dependency-name: minimist + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump minimist from 1.2.5 to 1.2.6 ([#8445](https://github.com/orhun/git-cliff/issues/8445)) -Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. -- [Release notes](https://github.com/substack/minimist/releases) -- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) - ---- -updated-dependencies: -- dependency-name: minimist - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. +- [Release notes](https://github.com/substack/minimist/releases) +- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) + +--- +updated-dependencies: +- dependency-name: minimist + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump follow-redirects in /packages/backend ([#8314](https://github.com/orhun/git-cliff/issues/8314)) -Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8. -- [Release notes](https://github.com/follow-redirects/follow-redirects/releases) -- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8) - ---- -updated-dependencies: -- dependency-name: follow-redirects - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8. +- [Release notes](https://github.com/follow-redirects/follow-redirects/releases) +- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8) + +--- +updated-dependencies: +- dependency-name: follow-redirects + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump follow-redirects from 1.14.1 to 1.14.8 ([#8313](https://github.com/orhun/git-cliff/issues/8313)) -Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.1 to 1.14.8. -- [Release notes](https://github.com/follow-redirects/follow-redirects/releases) -- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.1...v1.14.8) - ---- -updated-dependencies: -- dependency-name: follow-redirects - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.1 to 1.14.8. +- [Release notes](https://github.com/follow-redirects/follow-redirects/releases) +- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.1...v1.14.8) + +--- +updated-dependencies: +- dependency-name: follow-redirects + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps @@ -9677,19 +10543,19 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump axios from 0.21.1 to 0.21.4 ([#8471](https://github.com/orhun/git-cliff/issues/8471)) -Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. -- [Release notes](https://github.com/axios/axios/releases) -- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) -- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) - ---- -updated-dependencies: -- dependency-name: axios - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. +- [Release notes](https://github.com/axios/axios/releases) +- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) +- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) + +--- +updated-dependencies: +- dependency-name: axios + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Update deps @@ -9701,27 +10567,27 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump moment from 2.24.0 to 2.29.3 in /packages/backend ([#8531](https://github.com/orhun/git-cliff/issues/8531)) -Bumps [moment](https://github.com/moment/moment) from 2.24.0 to 2.29.3. -- [Release notes](https://github.com/moment/moment/releases) -- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md) -- [Commits](https://github.com/moment/moment/compare/2.24.0...2.29.3) - ---- -updated-dependencies: -- dependency-name: moment - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [moment](https://github.com/moment/moment) from 2.24.0 to 2.29.3. +- [Release notes](https://github.com/moment/moment/releases) +- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md) +- [Commits](https://github.com/moment/moment/compare/2.24.0...2.29.3) + +--- +updated-dependencies: +- dependency-name: moment + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(lint): fix type definitions for jsrsasign ([#8528](https://github.com/orhun/git-cliff/issues/8528)) -* fix type definitions for jsrsasign - -The @types/jsrsasign is not available in exactly the same version as the jsrsa -package misskey uses, so i used an earlier patch version of the same package. - +* fix type definitions for jsrsasign + +The @types/jsrsasign is not available in exactly the same version as the jsrsa +package misskey uses, so i used an earlier patch version of the same package. + * update yarn.lock - Chore: fix lint command for windows @@ -9734,45 +10600,45 @@ add user facing changes to changelog - Chore(deps): bump ejs from 3.1.6 to 3.1.7 in /packages/backend ([#8560](https://github.com/orhun/git-cliff/issues/8560)) -Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.7. -- [Release notes](https://github.com/mde/ejs/releases) -- [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md) -- [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.7) - ---- -updated-dependencies: -- dependency-name: ejs - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.7. +- [Release notes](https://github.com/mde/ejs/releases) +- [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md) +- [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.7) + +--- +updated-dependencies: +- dependency-name: ejs + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump postcss from 8.2.8 to 8.4.13 in /packages/client ([#8588](https://github.com/orhun/git-cliff/issues/8588)) -Bumps [postcss](https://github.com/postcss/postcss) from 8.2.8 to 8.4.13. -- [Release notes](https://github.com/postcss/postcss/releases) -- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) -- [Commits](https://github.com/postcss/postcss/compare/8.2.8...8.4.13) - ---- -updated-dependencies: -- dependency-name: postcss - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [postcss](https://github.com/postcss/postcss) from 8.2.8 to 8.4.13. +- [Release notes](https://github.com/postcss/postcss/releases) +- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) +- [Commits](https://github.com/postcss/postcss/compare/8.2.8...8.4.13) + +--- +updated-dependencies: +- dependency-name: postcss + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore: synchronize code and database schema ([#8577](https://github.com/orhun/git-cliff/issues/8577)) -* chore: remove default null - -null is always the default value if a table column is nullable, and typeorm's -@Column only accepts strings for default. - -* chore: synchronize code with database schema - +* chore: remove default null + +null is always the default value if a table column is nullable, and typeorm's +@Column only accepts strings for default. + +* chore: synchronize code with database schema + * chore: sync generated migrations with code - Update deps @@ -9782,34 +10648,34 @@ null is always the default value if a table column is nullable, and typeorm's - Chore(deps): bump path-parse from 1.0.6 to 1.0.7 ([#8705](https://github.com/orhun/git-cliff/issues/8705)) -Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. -- [Release notes](https://github.com/jbgutierrez/path-parse/releases) -- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) - ---- -updated-dependencies: -- dependency-name: path-parse - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. +- [Release notes](https://github.com/jbgutierrez/path-parse/releases) +- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) + +--- +updated-dependencies: +- dependency-name: path-parse + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump async from 3.2.0 to 3.2.3 in /packages/backend ([#8706](https://github.com/orhun/git-cliff/issues/8706)) -Bumps [async](https://github.com/caolan/async) from 3.2.0 to 3.2.3. -- [Release notes](https://github.com/caolan/async/releases) -- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) -- [Commits](https://github.com/caolan/async/compare/v3.2.0...v3.2.3) - ---- -updated-dependencies: -- dependency-name: async - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [async](https://github.com/caolan/async) from 3.2.0 to 3.2.3. +- [Release notes](https://github.com/caolan/async/releases) +- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) +- [Commits](https://github.com/caolan/async/compare/v3.2.0...v3.2.3) + +--- +updated-dependencies: +- dependency-name: async + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak loading spinner design @@ -9817,70 +10683,70 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump async from 3.2.1 to 3.2.3 in /packages/client ([#8707](https://github.com/orhun/git-cliff/issues/8707)) -Bumps [async](https://github.com/caolan/async) from 3.2.1 to 3.2.3. -- [Release notes](https://github.com/caolan/async/releases) -- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) -- [Commits](https://github.com/caolan/async/compare/v3.2.1...v3.2.3) - ---- -updated-dependencies: -- dependency-name: async - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [async](https://github.com/caolan/async) from 3.2.1 to 3.2.3. +- [Release notes](https://github.com/caolan/async/releases) +- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) +- [Commits](https://github.com/caolan/async/compare/v3.2.1...v3.2.3) + +--- +updated-dependencies: +- dependency-name: async + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump async from 3.2.1 to 3.2.3 ([#8501](https://github.com/orhun/git-cliff/issues/8501)) -Bumps [async](https://github.com/caolan/async) from 3.2.1 to 3.2.3. -- [Release notes](https://github.com/caolan/async/releases) -- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) -- [Commits](https://github.com/caolan/async/compare/v3.2.1...v3.2.3) - ---- -updated-dependencies: -- dependency-name: async - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [async](https://github.com/caolan/async) from 3.2.1 to 3.2.3. +- [Release notes](https://github.com/caolan/async/releases) +- [Changelog](https://github.com/caolan/async/blob/master/CHANGELOG.md) +- [Commits](https://github.com/caolan/async/compare/v3.2.1...v3.2.3) + +--- +updated-dependencies: +- dependency-name: async + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump copy-props from 2.0.4 to 2.0.5 ([#8709](https://github.com/orhun/git-cliff/issues/8709)) -Bumps [copy-props](https://github.com/gulpjs/copy-props) from 2.0.4 to 2.0.5. -- [Release notes](https://github.com/gulpjs/copy-props/releases) -- [Changelog](https://github.com/gulpjs/copy-props/blob/master/CHANGELOG.md) -- [Commits](https://github.com/gulpjs/copy-props/compare/2.0.4...2.0.5) - ---- -updated-dependencies: -- dependency-name: copy-props - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [copy-props](https://github.com/gulpjs/copy-props) from 2.0.4 to 2.0.5. +- [Release notes](https://github.com/gulpjs/copy-props/releases) +- [Changelog](https://github.com/gulpjs/copy-props/blob/master/CHANGELOG.md) +- [Commits](https://github.com/gulpjs/copy-props/compare/2.0.4...2.0.5) + +--- +updated-dependencies: +- dependency-name: copy-props + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(meta): add pixeldesu to patron list ([#8714](https://github.com/orhun/git-cliff/issues/8714)) - Chore(deps): bump hosted-git-info from 2.8.8 to 2.8.9 ([#8708](https://github.com/orhun/git-cliff/issues/8708)) -Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. -- [Release notes](https://github.com/npm/hosted-git-info/releases) -- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) -- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) - ---- -updated-dependencies: -- dependency-name: hosted-git-info - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. +- [Release notes](https://github.com/npm/hosted-git-info/releases) +- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) +- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) + +--- +updated-dependencies: +- dependency-name: hosted-git-info + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(dev): tweak text - Update deps @@ -9906,12 +10772,12 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore: fix some lints automatically ([#8788](https://github.com/orhun/git-cliff/issues/8788)) -* chore: fix some lints automatically - -Fixed lints that were automatically fixable with `eslint --fix`. - -* fix type - +* chore: fix some lints automatically + +Fixed lints that were automatically fixable with `eslint --fix`. + +* fix type + * workaround for empty interface lint - Chore: tweak logo @@ -9925,17 +10791,17 @@ Fixed lints that were automatically fixable with `eslint --fix`. - Chore: synchronize visibility checks ([#8687](https://github.com/orhun/git-cliff/issues/8687)) -* reuse single meId parameter - -* unify code style - -Use template string to avoid having to use escaped quote marks. - -* fix: follower only notes are visible to mentioned users - -This synchronizes the visibility rules with the Notes.isVisibleForMe -method from packages/backend/src/models/repositories/note.ts - +* reuse single meId parameter + +* unify code style + +Use template string to avoid having to use escaped quote marks. + +* fix: follower only notes are visible to mentioned users + +This synchronizes the visibility rules with the Notes.isVisibleForMe +method from packages/backend/src/models/repositories/note.ts + * add comment - Chore(client): tweak range control design @@ -9960,49 +10826,49 @@ method from packages/backend/src/models/repositories/note.ts - Chore(deps): bump undici from 5.4.0 to 5.5.1 in /packages/backend ([#8842](https://github.com/orhun/git-cliff/issues/8842)) -Bumps [undici](https://github.com/nodejs/undici) from 5.4.0 to 5.5.1. -- [Release notes](https://github.com/nodejs/undici/releases) -- [Commits](https://github.com/nodejs/undici/compare/v5.4.0...v5.5.1) - ---- -updated-dependencies: -- dependency-name: undici - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [undici](https://github.com/nodejs/undici) from 5.4.0 to 5.5.1. +- [Release notes](https://github.com/nodejs/undici/releases) +- [Commits](https://github.com/nodejs/undici/compare/v5.4.0...v5.5.1) + +--- +updated-dependencies: +- dependency-name: undici + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump jpeg-js from 0.4.1 to 0.4.4 in /packages/backend ([#8843](https://github.com/orhun/git-cliff/issues/8843)) -Bumps [jpeg-js](https://github.com/eugeneware/jpeg-js) from 0.4.1 to 0.4.4. -- [Release notes](https://github.com/eugeneware/jpeg-js/releases) -- [Commits](https://github.com/eugeneware/jpeg-js/compare/v0.4.1...v0.4.4) - ---- -updated-dependencies: -- dependency-name: jpeg-js - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [jpeg-js](https://github.com/eugeneware/jpeg-js) from 0.4.1 to 0.4.4. +- [Release notes](https://github.com/eugeneware/jpeg-js/releases) +- [Commits](https://github.com/eugeneware/jpeg-js/compare/v0.4.1...v0.4.4) + +--- +updated-dependencies: +- dependency-name: jpeg-js + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(deps): bump jsrsasign from 10.5.24 to 10.5.25 in /packages/backend ([#8889](https://github.com/orhun/git-cliff/issues/8889)) -Bumps [jsrsasign](https://github.com/kjur/jsrsasign) from 10.5.24 to 10.5.25. -- [Release notes](https://github.com/kjur/jsrsasign/releases) -- [Changelog](https://github.com/kjur/jsrsasign/blob/master/ChangeLog.txt) -- [Commits](https://github.com/kjur/jsrsasign/compare/10.5.24...10.5.25) - ---- -updated-dependencies: -- dependency-name: jsrsasign - dependency-type: direct:production -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [jsrsasign](https://github.com/kjur/jsrsasign) from 10.5.24 to 10.5.25. +- [Release notes](https://github.com/kjur/jsrsasign/releases) +- [Changelog](https://github.com/kjur/jsrsasign/blob/master/ChangeLog.txt) +- [Commits](https://github.com/kjur/jsrsasign/compare/10.5.24...10.5.25) + +--- +updated-dependencies: +- dependency-name: jsrsasign + dependency-type: direct:production +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(client): tweak ui @@ -10102,12 +10968,12 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore: fix client lint errors ([#8934](https://github.com/orhun/git-cliff/issues/8934)) -* Fix client lint - -* Hide no-v-html - -* Ignore banned type - +* Fix client lint + +* Hide no-v-html + +* Ignore banned type + * Update page-editor.vue - Chore(client): tweak ui @@ -10147,19 +11013,19 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore(deps): bump moment from 2.29.3 to 2.29.4 in /packages/backend ([#8958](https://github.com/orhun/git-cliff/issues/8958)) -Bumps [moment](https://github.com/moment/moment) from 2.29.3 to 2.29.4. -- [Release notes](https://github.com/moment/moment/releases) -- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) -- [Commits](https://github.com/moment/moment/compare/2.29.3...2.29.4) - ---- -updated-dependencies: -- dependency-name: moment - dependency-type: indirect -... - -Signed-off-by: dependabot[bot] <support@github.com> - +Bumps [moment](https://github.com/moment/moment) from 2.29.3 to 2.29.4. +- [Release notes](https://github.com/moment/moment/releases) +- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) +- [Commits](https://github.com/moment/moment/compare/2.29.3...2.29.4) + +--- +updated-dependencies: +- dependency-name: moment + dependency-type: indirect +... + +Signed-off-by: dependabot[bot] <support@github.com> + Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - Chore(server): tweak api for admin @@ -10224,10 +11090,10 @@ Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.c - Chore: improve ad style ([#8995](https://github.com/orhun/git-cliff/issues/8995)) -* Improve ad style - -* :art: - +* Improve ad style + +* :art: + * `ad` -> `info` - Chore(client): tweak style @@ -10307,30 +11173,30 @@ See: https://forum.vuejs.org/t/how-to-avoid-non-function-value-encountered-for-d - Perf: Improve network request performance ([#7636](https://github.com/orhun/git-cliff/issues/7636)) -* perf: Improve fetch - -* CHANGELOG - +* perf: Improve fetch + +* CHANGELOG + * lifo - Perf: Tune AP job queue timings ([#7635](https://github.com/orhun/git-cliff/issues/7635)) -* perf: Tune AP job queue timings - -* CHANGELOG - -* chore: add reference - +* perf: Tune AP job queue timings + +* CHANGELOG + +* chore: add reference + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Perf: delete-account処理を軽くする ([#7958](https://github.com/orhun/git-cliff/issues/7958)) -* Revert "#7892" - -This reverts commit 71d9c2a53d116a61f4c9b21ff98712a0000412b8. - -* アカウント削除処理でノート削除を重複して行なわないようにする - -* ドライブファイル削除時に参照しているノートを削除しないようにする - +* Revert "#7892" + +This reverts commit 71d9c2a53d116a61f4c9b21ff98712a0000412b8. + +* アカウント削除処理でノート削除を重複して行なわないようにする + +* ドライブファイル削除時に参照しているノートを削除しないようにする + * 不要となったコードを削除する - Perf(server): reduce memory usage of redis - Perf(server): reduce db query @@ -10357,9 +11223,9 @@ This reverts commit 71d9c2a53d116a61f4c9b21ff98712a0000412b8. - Perf: fix caching ([#8660](https://github.com/orhun/git-cliff/issues/8660)) -The cache implementation did previously not store the results of the -computation and was thus not a cache at all. This can cause a significant -number of database queries each time someone with a large number of +The cache implementation did previously not store the results of the +computation and was thus not a cache at all. This can cause a significant +number of database queries each time someone with a large number of followers does something that causes an activity to be federated. - Perf(client): remove needless reactivity @@ -10412,9 +11278,9 @@ followers does something that causes an activity to be federated. - Refactor(client): Add note - Refactor: use Object.fromEntries() instead of in-house implementation ([#6401](https://github.com/orhun/git-cliff/issues/6401)) -* refactor: use Object.fromEntries() -instead of in-house implementation - +* refactor: use Object.fromEntries() +instead of in-house implementation + * Remove extra type assertions - Refactor @@ -10495,16 +11361,16 @@ path aliasをサーバーサイドでも使ったりしたいため - Refactor mfm extract ([#7434](https://github.com/orhun/git-cliff/issues/7434)) -* refactor extractCustomEmojisFromMfm() - -* refactor extract-hashtags - -* refactor extract-mentions - -* refactor extract-hashtags - -* refactor extract-url-from-mfm - +* refactor extractCustomEmojisFromMfm() + +* refactor extract-hashtags + +* refactor extract-mentions + +* refactor extract-hashtags + +* refactor extract-url-from-mfm + * refactor extract-mentions - Refactor @@ -10531,24 +11397,24 @@ path aliasをサーバーサイドでも使ったりしたいため - Enhance(server): Improve user block ([#7640](https://github.com/orhun/git-cliff/issues/7640)) -* enhance(server): Improve user block - -* Update CHANGELOG.md - -* ユーザーリスト対応 - -* 相手から見れなくなるように - -* Update 1629004542760-chart-reindex.ts - -https://github.com/misskey-dev/misskey/commit/2365761ba5445f26c8b66b3b20ef4be44e70d549#commitcomment-54919821 - -* update test - -* add test - -* add todos - +* enhance(server): Improve user block + +* Update CHANGELOG.md + +* ユーザーリスト対応 + +* 相手から見れなくなるように + +* Update 1629004542760-chart-reindex.ts + +https://github.com/misskey-dev/misskey/commit/2365761ba5445f26c8b66b3b20ef4be44e70d549#commitcomment-54919821 + +* update test + +* add test + +* add todos + * Update 1629004542760-chart-reindex.ts - Refactor @@ -10564,23 +11430,23 @@ Related: #7658 - Refactor: localStorageのaccountsはindexedDBで保持するように ([#7609](https://github.com/orhun/git-cliff/issues/7609)) -* accountsストアはindexedDBで保持するように - -* fix lint - -* fix indexeddb available detection - -* remove debugging code - -* fix lint - -* resolve https://github.com/misskey-dev/misskey/pull/7609/files/ba756204b77ce6e1189b8443e9641f2d02119621#diff-f565878e8202f0037b830c780b7c0932dc1bb5fd3d05ede14d72d10efbc3740c -Firefoxでの動作を改善 - -* fix lint - -* fix lint - +* accountsストアはindexedDBで保持するように + +* fix lint + +* fix indexeddb available detection + +* remove debugging code + +* fix lint + +* resolve https://github.com/misskey-dev/misskey/pull/7609/files/ba756204b77ce6e1189b8443e9641f2d02119621#diff-f565878e8202f0037b830c780b7c0932dc1bb5fd3d05ede14d72d10efbc3740c +Firefoxでの動作を改善 + +* fix lint + +* fix lint + * add changelog - Enhance(client): Improve emoji autocomplete behaviour @@ -10588,26 +11454,26 @@ cherry picked from https://github.com/kat-atat/misskey/commit/4b2c215e25a0bae47f - Enhance(server): Use job queue for account delete ([#7668](https://github.com/orhun/git-cliff/issues/7668)) -* enhance(server): Use job queue for account delete - -Fix #5336 - -* ジョブをひとつに - -* remove done call - -* clean up - -* add User.isDeleted - -* コミット忘れ - -* Update 1629512953000-user-is-deleted.ts - -* show dialog - -* lint - +* enhance(server): Use job queue for account delete + +Fix #5336 + +* ジョブをひとつに + +* remove done call + +* clean up + +* add User.isDeleted + +* コミット忘れ + +* Update 1629512953000-user-is-deleted.ts + +* show dialog + +* lint + * Update 1629512953000-user-is-deleted.ts - Enhance: Improve account deletion experience @@ -10619,32 +11485,32 @@ Fix #5336 - Refactor: Expand schema ([#7772](https://github.com/orhun/git-cliff/issues/7772)) -* packedNotificationSchemaを更新 - -* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 - -* fix - -* add header, choice, invitation - -* test - -* fix - -* yatta - -* remove no longer needed "as PackedUser/PackedNote" - -* clean up - -* add simple-schema - -* fix lint - -* define items in full Schema - -* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 - +* packedNotificationSchemaを更新 + +* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 + +* fix + +* add header, choice, invitation + +* test + +* fix + +* yatta + +* remove no longer needed "as PackedUser/PackedNote" + +* clean up + +* add simple-schema + +* fix lint + +* define items in full Schema + +* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 + * user packとnote packの型不整合を修正 - Enhance(server): アカウントが凍結されたときのエラーを判定しやすく @@ -10652,10 +11518,10 @@ Fix #5336 - Enhance: ノートヘッダーにflex-shrinkを設定し、Acctを優先的に縮小して見栄えをよくするように ([#7752](https://github.com/orhun/git-cliff/issues/7752)) -* MAKE NOTE HEADER FLEX AGAIN - -* span => div - +* MAKE NOTE HEADER FLEX AGAIN + +* span => div + * remove submodules - Enhance(client): リスト、アンテナタイムラインを個別ページとして分割 @@ -10665,106 +11531,106 @@ Resolve #7756 - Refactor: PackedHoge型をPacked<'Hoge'>型に書き換える ([#7792](https://github.com/orhun/git-cliff/issues/7792)) -* packedNotificationSchemaを更新 - -* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 - -* fix - -* add header, choice, invitation - -* test - -* fix - -* yatta - -* remove no longer needed "as PackedUser/PackedNote" - -* clean up - -* add simple-schema - -* fix lint - -* define items in full Schema - -* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 - -* user packとnote packの型不整合を修正 - -* add prelude/types.ts - -* emoji - -* signin - -* game - -* matching - -* fix - -* add emoji schema - -* add reversiGame - -* add reversiMatching - -* remove signin schema (use Signin entity) - -* add Packed type - -* note-reaction - -* user - -* user-group - -* user-list - -* note - -* app, messaging-message - -* notification - -* drive-file - -* drive-folder - -* following - -* muting - -* blocking - -* hashtag - -* page - -* app (with modifying schema) - -* import user? - -* channel - -* antenna - -* clip - -* gallery-post - -* emoji - -* Packed - -* reversi-matching - -* add changelog - -* add changelog - +* packedNotificationSchemaを更新 + +* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 + +* fix + +* add header, choice, invitation + +* test + +* fix + +* yatta + +* remove no longer needed "as PackedUser/PackedNote" + +* clean up + +* add simple-schema + +* fix lint + +* define items in full Schema + +* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 + +* user packとnote packの型不整合を修正 + +* add prelude/types.ts + +* emoji + +* signin + +* game + +* matching + +* fix + +* add emoji schema + +* add reversiGame + +* add reversiMatching + +* remove signin schema (use Signin entity) + +* add Packed type + +* note-reaction + +* user + +* user-group + +* user-list + +* note + +* app, messaging-message + +* notification + +* drive-file + +* drive-folder + +* following + +* muting + +* blocking + +* hashtag + +* page + +* app (with modifying schema) + +* import user? + +* channel + +* antenna + +* clip + +* gallery-post + +* emoji + +* Packed + +* reversi-matching + +* add changelog + +* add changelog + * revert fix - Enhance(client): アップデートが利用可能な場合エラー表示およびダイアログ表示しないように @@ -10782,14 +11648,14 @@ Resolve #7854 - Enhance: ページロードエラーページにリロードボタンを追加 ([#7835](https://github.com/orhun/git-cliff/issues/7835)) -* wip - -* modify page load error page - -* add changelog - -* サーバーが死んでるエラーを追加 - +* wip + +* modify page load error page + +* add changelog + +* サーバーが死んでるエラーを追加 + * add MkLoading - Enhance(api): ap系のエンドポイントをログイン必須化+レートリミット追加 @@ -10811,223 +11677,223 @@ Resolve #7854 - Enhance: shareページでより多くの情報を渡せるように ([#7606](https://github.com/orhun/git-cliff/issues/7606)) -* shareでより多くの情報を渡せるように - -* from chat ui post-form, remove instant and add share - -* fix await eating array, make document - -* add changelog - -* https://github.com/misskey-dev/misskey/pull/7606/files/3581bf9a060742dc59bf7fb8ea7316809cc60522#r692265037 - -* reply, renoteにも型定義 - -* :art: - +* shareでより多くの情報を渡せるように + +* from chat ui post-form, remove instant and add share + +* fix await eating array, make document + +* add changelog + +* https://github.com/misskey-dev/misskey/pull/7606/files/3581bf9a060742dc59bf7fb8ea7316809cc60522#r692265037 + +* reply, renoteにも型定義 + +* :art: + * 閉じなければ100ms後タイムラインに - Refactor: publishHogeStreamとStreamのEventEmitterに型定義する ([#7769](https://github.com/orhun/git-cliff/issues/7769)) -* wip - -* wip - -* wip - -* :v: - -* add main stream - -* packedNotificationSchemaを更新 - -* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 - -* fix - -* ok - -* add header, choice, invitation - -* add header, choice, invitation - -* test - -* fix - -* fix - -* yatta - -* remove no longer needed "as PackedUser/PackedNote" - -* clean up - -* add simple-schema - -* fix lint - -* fix lint - -* wip - -* wip! - -* wip - -* fix - -* wip - -* wip - -* :v: - -* 送信側に型エラーがないことを3回確認した - -* :v: - -* wip - -* update typescript - -* define items in full Schema - -* edit comment - -* edit comment - -* edit comment - -* Update src/prelude/types.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* https://github.com/misskey-dev/misskey/pull/7769#discussion_r703058458 - -* user packとnote packの型不整合を修正 - -* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 - -* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 - -* user packとnote packの型不整合を修正 - -* add prelude/types.ts - -* emoji - -* signin - -* game - -* matching - -* clean up - -* ev => data - -* refactor - -* clean up - -* add type - -* antenna - -* channel - -* fix - -* add Packed type - -* add PackedRef - -* fix lint - -* add emoji schema - -* add reversiGame - -* add reversiMatching - -* remove signin schema (use Signin entity) - -* add schemas refs, fix Packed type - -* wip PackedHoge => Packed<'Hoge'> - -* add Packed type - -* note-reaction - -* user - -* user-group - -* user-list - -* note - -* app, messaging-message - -* notification - -* drive-file - -* drive-folder - -* following - -* muting - -* blocking - -* hashtag - -* page - -* app (with modifying schema) - -* import user? - -* channel - -* antenna - -* clip - -* gallery-post - -* emoji - -* Packed - -* reversi-matching - -* update stream.ts - -* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 - -* fix lint - -* clean up? - -* add changelog - -* add changelog - -* add changelog - -* fix: アンテナが既読にならないのを修正 - -* revert fix - -* https://github.com/misskey-dev/misskey/pull/7769#discussion_r711474875 - -* spec => payload - -* edit commetn - +* wip + +* wip + +* wip + +* :v: + +* add main stream + +* packedNotificationSchemaを更新 + +* read:gallery, write:gallery, read:gallery-likes, write:gallery-likesに翻訳を追加 + +* fix + +* ok + +* add header, choice, invitation + +* add header, choice, invitation + +* test + +* fix + +* fix + +* yatta + +* remove no longer needed "as PackedUser/PackedNote" + +* clean up + +* add simple-schema + +* fix lint + +* fix lint + +* wip + +* wip! + +* wip + +* fix + +* wip + +* wip + +* :v: + +* 送信側に型エラーがないことを3回確認した + +* :v: + +* wip + +* update typescript + +* define items in full Schema + +* edit comment + +* edit comment + +* edit comment + +* Update src/prelude/types.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* https://github.com/misskey-dev/misskey/pull/7769#discussion_r703058458 + +* user packとnote packの型不整合を修正 + +* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 + +* revert https://github.com/misskey-dev/misskey/pull/7772#discussion_r706627736 + +* user packとnote packの型不整合を修正 + +* add prelude/types.ts + +* emoji + +* signin + +* game + +* matching + +* clean up + +* ev => data + +* refactor + +* clean up + +* add type + +* antenna + +* channel + +* fix + +* add Packed type + +* add PackedRef + +* fix lint + +* add emoji schema + +* add reversiGame + +* add reversiMatching + +* remove signin schema (use Signin entity) + +* add schemas refs, fix Packed type + +* wip PackedHoge => Packed<'Hoge'> + +* add Packed type + +* note-reaction + +* user + +* user-group + +* user-list + +* note + +* app, messaging-message + +* notification + +* drive-file + +* drive-folder + +* following + +* muting + +* blocking + +* hashtag + +* page + +* app (with modifying schema) + +* import user? + +* channel + +* antenna + +* clip + +* gallery-post + +* emoji + +* Packed + +* reversi-matching + +* update stream.ts + +* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 + +* fix lint + +* clean up? + +* add changelog + +* add changelog + +* add changelog + +* fix: アンテナが既読にならないのを修正 + +* revert fix + +* https://github.com/misskey-dev/misskey/pull/7769#discussion_r711474875 + +* spec => payload + +* edit commetn + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Refactor clinet @@ -11037,23 +11903,23 @@ Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Enhance: Provide Twemoji SVGs from Misskey server ([#2](https://github.com/orhun/git-cliff/issues/2)) ([#7897](https://github.com/orhun/git-cliff/issues/7897)) -* Selfhosting Twemoji - -* ちっ - -* うざっ - -* あ - -* add test - +* Selfhosting Twemoji + +* ちっ + +* うざっ + +* あ + +* add test + Co-authored-by: mei23 <m@m544.net> - Refactor - Refactor: Introduce list of MFM Functions ([#7882](https://github.com/orhun/git-cliff/issues/7882)) -* introduce list of MFM Functions - +* introduce list of MFM Functions + * add note - Refactoring @@ -11069,21 +11935,21 @@ Resolve #7779 - Enhance: show renoters ([#7954](https://github.com/orhun/git-cliff/issues/7954)) -* refactor: deduplicate renote button into component - -For now the renoters tooltip just uses the reaction viewer component -with a fixed emoji symbol instead. - -* chore: remove unnecessary CSS - -* fix: forgot to rename variable - -* enhance: use own tooltip instead of reaction viewer - -* clean up style - -* fix additional renoters number - +* refactor: deduplicate renote button into component + +For now the renoters tooltip just uses the reaction viewer component +with a fixed emoji symbol instead. + +* chore: remove unnecessary CSS + +* fix: forgot to rename variable + +* enhance: use own tooltip instead of reaction viewer + +* clean up style + +* fix additional renoters number + * rename file to better represent content - Refactor(client): use composition api for tooltip logic @@ -11150,22 +12016,22 @@ Fix #8029 - Enhance: pizzaxでstreamingのuser storage updateイベントを監視して更新 ([#8095](https://github.com/orhun/git-cliff/issues/8095)) -* wip - -* wip? - -* ? - -* streamingのuser storage updateイベントを監視して更新 - -* 必要な時以外はストレージを更新しない - -* fix? - -* wip - -* fix - +* wip + +* wip? + +* ? + +* streamingのuser storage updateイベントを監視して更新 + +* 必要な時以外はストレージを更新しない + +* fix? + +* wip + +* fix + * fix - Enhance(client): tweak ui @@ -11177,8 +12043,8 @@ Fix #8029 - Enhance: 許可されていないファイルタイプでは、オブジェクトストレージのファイル名に拡張子を付与しないように ([#8108](https://github.com/orhun/git-cliff/issues/8108)) -* 許可されていないファイルタイプでは、オブジェクトストレージのファイル名に拡張子を付与しないように - +* 許可されていないファイルタイプでは、オブジェクトストレージのファイル名に拡張子を付与しないように + * add comment - Refactor(client): use composition api @@ -11200,67 +12066,67 @@ Fix #8029 - Refactor: Widgetのcomposition api移行 ([#8125](https://github.com/orhun/git-cliff/issues/8125)) -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + * fix - Refactor: Composition APIへ移行 ([#8121](https://github.com/orhun/git-cliff/issues/8121)) -* components/abuse-report-window.vue - -* use <script setup> - -* :v: - -* components/analog-clock.vue - -* wip components/autocomplete.vue - -* :v: - -* :v: - -* fix - -* wip components/captcha.vue - -* clean up - -* components/channel-follow-button - -* components/channel-preview.vue - -* components/core-core.vue - -* components/code.vue - -* wip components/date-separated-list.vue - -* fix - -* fix autocomplete.vue - -* :v: - -* remove global property - -* use <script setup> - -* components/dialog.vue - -* clena up - -* fix dialog.vue - +* components/abuse-report-window.vue + +* use <script setup> + +* :v: + +* components/analog-clock.vue + +* wip components/autocomplete.vue + +* :v: + +* :v: + +* fix + +* wip components/captcha.vue + +* clean up + +* components/channel-follow-button + +* components/channel-preview.vue + +* components/core-core.vue + +* components/code.vue + +* wip components/date-separated-list.vue + +* fix + +* fix autocomplete.vue + +* :v: + +* remove global property + +* use <script setup> + +* components/dialog.vue + +* clena up + +* fix dialog.vue + * Resolve https://github.com/misskey-dev/misskey/pull/8121#discussion_r781250966 - Refactor @@ -11276,204 +12142,204 @@ Fix #8029 - Refactor: APIエンドポイントファイルの定義を良い感じにする ([#8154](https://github.com/orhun/git-cliff/issues/8154)) -* Fix API Schema Error - -* Delete SimpleSchema/SimpleObj -and Move schemas to dedicated files - -* Userのスキーマを分割してみる - -* define packMany type - -* add , - -* Ensure enum schema and Make "as const" put once - -* test? - -* Revert "test?" - -This reverts commit 97dc9bfa70851bfb7d1cf38e883f8df20fb78b79. - -* Revert "Fix API Schema Error" - -This reverts commit 21b6176d974ed8e3eb73723ad21a105c5d297323. - -* :v: - -* clean up - -* test? - -* wip - -* wip - -* better schema def - -* :v: - -* fix - -* add minLength property - -* wip - -* wip - -* wip - -* anyOf/oneOf/allOfに対応? ~ relation.ts - -* refactor! - -* Define MinimumSchema - -* wip - -* wip - -* anyOf/oneOf/allOfが動作するようにUnionSchemaTypeを修正 - -* anyOf/oneOf/allOfが動作するようにUnionSchemaTypeを修正 - -* Update packages/backend/src/misc/schema.ts - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* fix - -* array oneOfをより正確な型に - -* array oneOfをより正確な型に - -* wip - -* :v: - -* なんかもういろいろ - -* remove - -* very good schema - -* api schema - -* wip - -* refactor: awaitAllの型定義を変えてみる - -* fix - -* specify types in awaitAll - -* specify types in awaitAll - -* :v: - -* wip - -* ... - -* :v: - -* AllowDateはやめておく - -* 不必要なoptional: false, nullable: falseを廃止 - -* Packedが展開されないように - -* 続packed - -* wip - -* define note type - -* wip - -* UserDetailedをMeDetailedかUserDetailedNotMeかを区別できるように - -* wip - -* wip - -* wip specify user type of other schemas - -* ok - -* convertSchemaToOpenApiSchemaを改修 - -* convertSchemaToOpenApiSchemaを改修 - -* Fix - -* fix - -* :v: - -* wip - -* 分割代入ではなくallOfで定義するように - +* Fix API Schema Error + +* Delete SimpleSchema/SimpleObj +and Move schemas to dedicated files + +* Userのスキーマを分割してみる + +* define packMany type + +* add , + +* Ensure enum schema and Make "as const" put once + +* test? + +* Revert "test?" + +This reverts commit 97dc9bfa70851bfb7d1cf38e883f8df20fb78b79. + +* Revert "Fix API Schema Error" + +This reverts commit 21b6176d974ed8e3eb73723ad21a105c5d297323. + +* :v: + +* clean up + +* test? + +* wip + +* wip + +* better schema def + +* :v: + +* fix + +* add minLength property + +* wip + +* wip + +* wip + +* anyOf/oneOf/allOfに対応? ~ relation.ts + +* refactor! + +* Define MinimumSchema + +* wip + +* wip + +* anyOf/oneOf/allOfが動作するようにUnionSchemaTypeを修正 + +* anyOf/oneOf/allOfが動作するようにUnionSchemaTypeを修正 + +* Update packages/backend/src/misc/schema.ts + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* fix + +* array oneOfをより正確な型に + +* array oneOfをより正確な型に + +* wip + +* :v: + +* なんかもういろいろ + +* remove + +* very good schema + +* api schema + +* wip + +* refactor: awaitAllの型定義を変えてみる + +* fix + +* specify types in awaitAll + +* specify types in awaitAll + +* :v: + +* wip + +* ... + +* :v: + +* AllowDateはやめておく + +* 不必要なoptional: false, nullable: falseを廃止 + +* Packedが展開されないように + +* 続packed + +* wip + +* define note type + +* wip + +* UserDetailedをMeDetailedかUserDetailedNotMeかを区別できるように + +* wip + +* wip + +* wip specify user type of other schemas + +* ok + +* convertSchemaToOpenApiSchemaを改修 + +* convertSchemaToOpenApiSchemaを改修 + +* Fix + +* fix + +* :v: + +* wip + +* 分割代入ではなくallOfで定義するように + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Refactor: Composition APIへ移行 ([#8138](https://github.com/orhun/git-cliff/issues/8138)) -* components/drive-file-thumbnail.vue - -* components/drive-select-dialog.vue - -* components/drive-window.vue - -* wip - -* wip drive.file.vue, drive.vue - -* fix prop - -* wip( - -* components/drive.folder.vue - -* maybe ok - -* :v: - -* fix variable - -* FIX FOLDER VARIABLE - -* components/emoji-picker-dialog.vue - -* Hate `$emit` - -* hate global property - -* components/emoji-picker-window.vue - -* components/emoji-picker.section.vue - -* fix - -* fixx - -* wip components/emoji-picker.vue - -* fix - -* defineExpose - -* ユニコード絵文字の型をもっといい感じに - -* components/featured-photos.vue - -* components/follow-button.vue - -* forgot-password.vue - -* forgot-password.vue - -* :art: - +* components/drive-file-thumbnail.vue + +* components/drive-select-dialog.vue + +* components/drive-window.vue + +* wip + +* wip drive.file.vue, drive.vue + +* fix prop + +* wip( + +* components/drive.folder.vue + +* maybe ok + +* :v: + +* fix variable + +* FIX FOLDER VARIABLE + +* components/emoji-picker-dialog.vue + +* Hate `$emit` + +* hate global property + +* components/emoji-picker-window.vue + +* components/emoji-picker.section.vue + +* fix + +* fixx + +* wip components/emoji-picker.vue + +* fix + +* defineExpose + +* ユニコード絵文字の型をもっといい感じに + +* components/featured-photos.vue + +* components/follow-button.vue + +* forgot-password.vue + +* forgot-password.vue + +* :art: + * fix - Refactor @@ -11485,147 +12351,147 @@ Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Enhance: Forward report ([#8001](https://github.com/orhun/git-cliff/issues/8001)) -* implement sending AP Flag object - -Optionally allow a user to select to forward a report about a remote -user to the other instance. This is added in a backwards-compatible way. - -* add locale string - -* forward report only for moderators - -* add switch to moderator UI to forward report - -* fix report note url - -* return forwarded status from API - -apparently forgot to carry this over from my testing environment - -* object in Flag activity has to be an array - -For correct interoperability with Pleroma the "object" property of the Flag -activity has to be an array. - -This array will in the future also hold the link to respective notes, so it -makes sense to correct this on our side. - -* Update get-note-menu.ts - +* implement sending AP Flag object + +Optionally allow a user to select to forward a report about a remote +user to the other instance. This is added in a backwards-compatible way. + +* add locale string + +* forward report only for moderators + +* add switch to moderator UI to forward report + +* fix report note url + +* return forwarded status from API + +apparently forgot to carry this over from my testing environment + +* object in Flag activity has to be an array + +For correct interoperability with Pleroma the "object" property of the Flag +activity has to be an array. + +This array will in the future also hold the link to respective notes, so it +makes sense to correct this on our side. + +* Update get-note-menu.ts + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: e2eテストをできるだけ改良してみた ([#8159](https://github.com/orhun/git-cliff/issues/8159)) -* update docker image? - -* 続 - -* serial run delete from "${table}" cascade - -* use cypress official github action - -* refuse install by cypress action - -* clean up - -* use wait? - -* use more wait? - -* Revert "use more wait?" - -This reverts commit 18d0fcae9c7d8f98a4cafb4a846a031ece57350c. - -* Revert "use wait?" - -This reverts commit 5aa8feec9cdc3e2f79e566249f0a0eff6c0df6a0. - -* fix - -* test - -* test - -* log? - -* 握りつぶしてみる - -* clean up - -* env? - -* clean up? - -* disable video - -* add comment - -* remove test - -* 成功? - -* test browser - -* nodeインストール無効化 - -* node16.13.0-chrome95-ff94 - -* node.js復活 - -* ? - -* ちょっと戻してみる - -* chrome? - -* cross browser test2 - -* --shm-size=2g - -* artifact? - -* misskey.local? - -* firefoxはあきらめる - -* not headless? - -* oops - -* fix - -* ?? - -* test1 - -* if? - -* fail-fast: false - -* headless: false - -* easy error ignoreing describe - -* エラーの解消 -とちょっとリファクター - -* add browser name to artifact - -* Install mplayer for FireFox - -* no wait? - -* タイムアウトを甘くしてみる - -* firefoxをあきらめる(n回目) - -* remove timeout setting - -* wait復活 - -* Update basic.js - -* Update index.js - +* update docker image? + +* 続 + +* serial run delete from "${table}" cascade + +* use cypress official github action + +* refuse install by cypress action + +* clean up + +* use wait? + +* use more wait? + +* Revert "use more wait?" + +This reverts commit 18d0fcae9c7d8f98a4cafb4a846a031ece57350c. + +* Revert "use wait?" + +This reverts commit 5aa8feec9cdc3e2f79e566249f0a0eff6c0df6a0. + +* fix + +* test + +* test + +* log? + +* 握りつぶしてみる + +* clean up + +* env? + +* clean up? + +* disable video + +* add comment + +* remove test + +* 成功? + +* test browser + +* nodeインストール無効化 + +* node16.13.0-chrome95-ff94 + +* node.js復活 + +* ? + +* ちょっと戻してみる + +* chrome? + +* cross browser test2 + +* --shm-size=2g + +* artifact? + +* misskey.local? + +* firefoxはあきらめる + +* not headless? + +* oops + +* fix + +* ?? + +* test1 + +* if? + +* fail-fast: false + +* headless: false + +* easy error ignoreing describe + +* エラーの解消 +とちょっとリファクター + +* add browser name to artifact + +* Install mplayer for FireFox + +* no wait? + +* タイムアウトを甘くしてみる + +* firefoxをあきらめる(n回目) + +* remove timeout setting + +* wait復活 + +* Update basic.js + +* Update index.js + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor @@ -11633,27 +12499,27 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor, enhance: ドライブ引数のオブジェクト化, 追加時のcomment指定 ([#8180](https://github.com/orhun/git-cliff/issues/8180)) -* refactor: ドライブの引数をオブジェクト化する Resolve #8177 - -* Resolve #8181 - -* fix - +* refactor: ドライブの引数をオブジェクト化する Resolve #8177 + +* Resolve #8181 + +* fix + * archivePath - Refactor(backend): use insert instead of save - Enhance: Improve poll-editor UI + composition port ([#8186](https://github.com/orhun/git-cliff/issues/8186)) -* Poll editor UI changes - -Use a horizontal layout when possible, wrap to vertical when constrained - -* Port poll-editor to composition API - -* Fix poll-editor `get` time calcs - -* fix - +* Poll editor UI changes + +Use a horizontal layout when possible, wrap to vertical when constrained + +* Port poll-editor to composition API + +* Fix poll-editor `get` time calcs + +* fix + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor @@ -11665,8 +12531,8 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: MediaListでは、サーバーで許可された形式しか表示しないように ([#8113](https://github.com/orhun/git-cliff/issues/8113)) -* wip - +* wip + * fix - Refactor(client): use composition api @@ -11686,26 +12552,26 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: メニュー関連をComposition API化、switchアイテム追加 ([#8215](https://github.com/orhun/git-cliff/issues/8215)) -* メニューをComposition API化、switchアイテム追加 -クライアントサイド画像圧縮の準備 - -* メニュー型定義を分離 (TypeScriptの型支援が効かないので) - -* disabled - -* make keepOriginal to follow setting value - -* fix - -* fix - -* Fix - +* メニューをComposition API化、switchアイテム追加 +クライアントサイド画像圧縮の準備 + +* メニュー型定義を分離 (TypeScriptの型支援が効かないので) + +* disabled + +* make keepOriginal to follow setting value + +* fix + +* fix + +* Fix + * clean up - Refactor: APIで非JSON入力の型変換はendpointに渡す前に行うように ([#8229](https://github.com/orhun/git-cliff/issues/8229)) -* Resolve #8228 - +* Resolve #8228 + * fix - Enhance(client): Chartjsのツールチップを自前に @@ -11761,122 +12627,122 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor: use ajv instead of cafy ([#8324](https://github.com/orhun/git-cliff/issues/8324)) -* wip - -* wip - -* Update abuse-user-reports.ts - -* Update files.ts - -* Update list-remote.ts - -* Update list.ts - -* Update show-users.ts - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* Update update.ts - -* Update search.ts - -* Update reactions.ts - -* Update search.ts - -* wip - -* wip - -* wip - -* wip - -* Update update.ts - -* Update relation.ts - -* Update available.ts - -* wip - -* wip - -* wip - -* Update packages/backend/src/server/api/define.ts - -Co-authored-by: Johann150 <johann.galle@protonmail.com> - -* Update define.ts - -* Update define.ts - -* typo - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* Update update.ts - -* wip - -* Update signup.ts - -* Update call.ts - -* minimum for limit - -* type - -* remove needless annotation - -* wip - -* Update signup.ts - -* wip - -* wip - -* fix - -* Update create.ts - +* wip + +* wip + +* Update abuse-user-reports.ts + +* Update files.ts + +* Update list-remote.ts + +* Update list.ts + +* Update show-users.ts + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* Update update.ts + +* Update search.ts + +* Update reactions.ts + +* Update search.ts + +* wip + +* wip + +* wip + +* wip + +* Update update.ts + +* Update relation.ts + +* Update available.ts + +* wip + +* wip + +* wip + +* Update packages/backend/src/server/api/define.ts + +Co-authored-by: Johann150 <johann.galle@protonmail.com> + +* Update define.ts + +* Update define.ts + +* typo + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* Update update.ts + +* wip + +* Update signup.ts + +* Update call.ts + +* minimum for limit + +* type + +* remove needless annotation + +* wip + +* Update signup.ts + +* wip + +* wip + +* fix + +* Update create.ts + Co-authored-by: Johann150 <johann.galle@protonmail.com> - Refactor: fix type @@ -11890,18 +12756,18 @@ Co-authored-by: Johann150 <johann.galle@protonmail.com> - Refactor: Use ESM ([#8358](https://github.com/orhun/git-cliff/issues/8358)) -* wip - -* wip - -* fix - -* clean up - -* Update tsconfig.json - -* Update activitypub.ts - +* wip + +* wip + +* fix + +* clean up + +* Update tsconfig.json + +* Update activitypub.ts + * wip - Refactor @@ -11919,26 +12785,26 @@ Co-authored-by: Johann150 <johann.galle@protonmail.com> - Refactor: migrate to typeorm 3.0 ([#8443](https://github.com/orhun/git-cliff/issues/8443)) -* wip - -* wip - -* wip - -* Update following.ts - -* wip - -* wip - -* wip - -* Update resolve-user.ts - -* maxQueryExecutionTime - -* wip - +* wip + +* wip + +* wip + +* Update following.ts + +* wip + +* wip + +* wip + +* Update resolve-user.ts + +* maxQueryExecutionTime + +* wip + * wip - Refactor and performance improvements @@ -11950,55 +12816,55 @@ Co-authored-by: Johann150 <johann.galle@protonmail.com> - Enhance(doc): required input fields ([#8456](https://github.com/orhun/git-cliff/issues/8456)) -* remove empty file - -If the endpoint is to be implemented later, the file can be added back, -but for now it is confusing to have an empty file. - -* enhance(doc): document defaults - -Default for `isPublic` is based on the database schema default value. -Defaults for `local` and `withFiles` are based on the behaviour of the endpoint. - -* enhance(doc): explain nullable emoji category - -* fix: make nullable if default is null - -* enhance(doc): explain mute attribute expiresAt - -* fix: define required fields - -- `notes/create`: the default for `text` has been removed because ajv can not handle - `default` inside of `anyOf`, see - https://ajv.js.org/guide/modifying-data.html#assigning-defaults - and the default value cannot be `null` if text is `nullable: false` in the `anyOf` - first alternative. -- `notes/create`: The `mediaIds` property has been marked as deprecated because it - has the same behaviour as using `fileIds`, but the implementation tries to handlè - `fileIds` first. -- The result schema for `admin/emoji/list` has been altered because the `host` - property will always be `null` as it is filtered this way in the database query. - See packages/backend/src/server/api/endpoints/admin/emoji/list.ts line 67. - -* enhance(doc): explain nullable hostname - -* update changelog - +* remove empty file + +If the endpoint is to be implemented later, the file can be added back, +but for now it is confusing to have an empty file. + +* enhance(doc): document defaults + +Default for `isPublic` is based on the database schema default value. +Defaults for `local` and `withFiles` are based on the behaviour of the endpoint. + +* enhance(doc): explain nullable emoji category + +* fix: make nullable if default is null + +* enhance(doc): explain mute attribute expiresAt + +* fix: define required fields + +- `notes/create`: the default for `text` has been removed because ajv can not handle + `default` inside of `anyOf`, see + https://ajv.js.org/guide/modifying-data.html#assigning-defaults + and the default value cannot be `null` if text is `nullable: false` in the `anyOf` + first alternative. +- `notes/create`: The `mediaIds` property has been marked as deprecated because it + has the same behaviour as using `fileIds`, but the implementation tries to handlè + `fileIds` first. +- The result schema for `admin/emoji/list` has been altered because the `host` + property will always be `null` as it is filtered this way in the database query. + See packages/backend/src/server/api/endpoints/admin/emoji/list.ts line 67. + +* enhance(doc): explain nullable hostname + +* update changelog + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: タッチパッド・タッチスクリーンでのデッキの操作性を向上 ([#8450](https://github.com/orhun/git-cliff/issues/8450)) -* enhance experience of deck with touchpad - -* test: 単純にdeltaYを加算してみる - -* clean up - -* ios bug fix? - -* :v: - -* use overflow-y - +* enhance experience of deck with touchpad + +* test: 単純にdeltaYを加算してみる + +* clean up + +* ios bug fix? + +* :v: + +* use overflow-y + * Safari does not supports clip - Refactor actions @@ -12048,86 +12914,86 @@ Resolve #8467 - Enhance: only render public notes in HTML template ([#8527](https://github.com/orhun/git-cliff/issues/8527)) -* only render public notes in HTML template - +* only render public notes in HTML template + * fix missing import - Refactor: use composition API ([#8541](https://github.com/orhun/git-cliff/issues/8541)) - Enhance: ドライブに画像ファイルをアップロードするときオリジナル画像を破棄してwebpublicのみ保持するオプション ([#8216](https://github.com/orhun/git-cliff/issues/8216)) -* wip - -* Update packages/client/src/os.ts - -Co-authored-by: tamaina <tamaina@hotmail.co.jp> - -* メニューをComposition API化、switchアイテム追加 -クライアントサイド画像圧縮の準備 - -* メニュー型定義を分離 (TypeScriptの型支援が効かないので) - -* disabled - -* make keepOriginal to follow setting value - -* :v: - -* fix - -* fix - -* :v: - -* WEBP - -* aaa - -* :v: - -* webp - -* lazy load browser-image-resizer - -* rename - -* rename 2 - -* Fix - -* clean up - -* add comment - -* clean up - -* jpeg, pngにもどす - -* fix - -* fix name - -* webpでなくする ただしサムネやプレビューはwebpのまま (テスト) - -* 動画サムネイルはjpegに - -* エラーハンドリング - -* :v: - -* v2.2.1-misskey-beta.2 - -* browser-image-resizer#v2.2.1-misskey.1 - -* :v: - -* fix alert - -* update browser-image-resizer to v2.2.1-misskey.2 - -* lockfile - -Co-authored-by: mei23 <m@m544.net> +* wip + +* Update packages/client/src/os.ts + +Co-authored-by: tamaina <tamaina@hotmail.co.jp> + +* メニューをComposition API化、switchアイテム追加 +クライアントサイド画像圧縮の準備 + +* メニュー型定義を分離 (TypeScriptの型支援が効かないので) + +* disabled + +* make keepOriginal to follow setting value + +* :v: + +* fix + +* fix + +* :v: + +* WEBP + +* aaa + +* :v: + +* webp + +* lazy load browser-image-resizer + +* rename + +* rename 2 + +* Fix + +* clean up + +* add comment + +* clean up + +* jpeg, pngにもどす + +* fix + +* fix name + +* webpでなくする ただしサムネやプレビューはwebpのまま (テスト) + +* 動画サムネイルはjpegに + +* エラーハンドリング + +* :v: + +* v2.2.1-misskey-beta.2 + +* browser-image-resizer#v2.2.1-misskey.1 + +* :v: + +* fix alert + +* update browser-image-resizer to v2.2.1-misskey.2 + +* lockfile + +Co-authored-by: mei23 <m@m544.net> Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> - Refactor(client): refactor api-console to use Composition API ([#8566](https://github.com/orhun/git-cliff/issues/8566)) @@ -12140,266 +13006,266 @@ Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com> - Refactor: use Vite to build instead of webpack ([#8575](https://github.com/orhun/git-cliff/issues/8575)) -* update stream.ts - -* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 - -* fix lint - -* clean up? - -* add app - -* fix - -* nanka iroiro - -* wip - -* wip - -* fix lint - -* fix loginId - -* fix - -* refactor - -* refactor - -* remove follow action - -* clean up - -* Revert "remove follow action" - -This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. - -* Revert "clean up" - -This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. - -* remove fetch specification - -* renoteの条件追加 - -* apiFetch => cli - -* bypass fetch? - -* fix - -* refactor: use path alias - -* temp: add submodule - -* remove submodule - -* enhane: unison-reloadに指定したパスに移動できるように - -* null - -* null - -* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 - -* null - -* await? - -* rename - -* rename - -* Update read.ts - -* merge - -* get-note-summary - -* fix - -* swパッケージに - -* add missing packages - -* fix getNoteSummary - -* add webpack-cli - -* :v: - -* remove plugins - -* sw-inject分離したがテストしてない - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix notification.vue - -* remove a blank line - -* disconnect intersection observer - -* disconnect2 - -* fix - -* :v: - -* clean up config - -* typesを戻した - -* Update packages/client/src/components/notification.vue - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - -* disconnect - -* oops - -* Failed to load the script unexpectedly回避 -sw.jsとlib.tsを分離してみた - -* truncate notification - -* Update packages/client/src/ui/_common_/common.vue - -Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - -* clean up - -* clean up - -* キャッシュ対策 - -* Truncate push notification message - -* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 - -* components/drive-file-thumbnail.vue - -* components/drive-select-dialog.vue - -* components/drive-window.vue - -* merge - -* fix - -* Service Workerのビルドにesbuildを使うようにする - -* return createEmptyNotification() - -* fix - -* i18n.ts - -* update - -* :v: - -* remove ts-loader - -* fix - -* fix - -* enhance: Service Workerを常に登録するように - -* pollEnded - -* URLをsw.jsに戻す - -* clean up - -* wip - -* wip - -* wip - -* wip - -* wip - -* wip - -* :v: - -* use import - -* fix - -* install rollup - -* use defineAsyncComponent. - -* fix emojilist - -* wip use defineAsyncComponent - -* popup(import -> popup(defineAsyncComponent(() => import - -* draggable? - -* fix init import - -* clean up - -* fix router - -* add comment - -* :v: - -* :v: - -* :v: - -* remove webpack - -* update vite - -* fix boot sequence - -* Revert "fix boot sequence" - -This reverts commit e893dbf37aed83bf9f12e427d98c78a7065b4a39. - -* revert boot import - -* never make two app div - -* ; - -* remove console.log - -* change clientEntry sequence - -* fix - -* Revert "fix" - -This reverts commit 12741b3d89950a31dbb1bb81477ddb27b0e9951a. - -* fix - -* add comment https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 - -* add log - -* add comment - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> +* update stream.ts + +* https://github.com/misskey-dev/misskey/pull/7769#issuecomment-917542339 + +* fix lint + +* clean up? + +* add app + +* fix + +* nanka iroiro + +* wip + +* wip + +* fix lint + +* fix loginId + +* fix + +* refactor + +* refactor + +* remove follow action + +* clean up + +* Revert "remove follow action" + +This reverts commit defbb416480905af2150d1c92f10d8e1d1288c0a. + +* Revert "clean up" + +This reverts commit f94919cb9cff41e274044fc69c56ad36a33974f2. + +* remove fetch specification + +* renoteの条件追加 + +* apiFetch => cli + +* bypass fetch? + +* fix + +* refactor: use path alias + +* temp: add submodule + +* remove submodule + +* enhane: unison-reloadに指定したパスに移動できるように + +* null + +* null + +* feat: ログインするアカウントのIDをクエリ文字列で指定する機能 + +* null + +* await? + +* rename + +* rename + +* Update read.ts + +* merge + +* get-note-summary + +* fix + +* swパッケージに + +* add missing packages + +* fix getNoteSummary + +* add webpack-cli + +* :v: + +* remove plugins + +* sw-inject分離したがテストしてない + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix notification.vue + +* remove a blank line + +* disconnect intersection observer + +* disconnect2 + +* fix + +* :v: + +* clean up config + +* typesを戻した + +* Update packages/client/src/components/notification.vue + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + +* disconnect + +* oops + +* Failed to load the script unexpectedly回避 +sw.jsとlib.tsを分離してみた + +* truncate notification + +* Update packages/client/src/ui/_common_/common.vue + +Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> + +* clean up + +* clean up + +* キャッシュ対策 + +* Truncate push notification message + +* クライアントがあったらストリームに接続しているということなので通知しない判定の位置を修正 + +* components/drive-file-thumbnail.vue + +* components/drive-select-dialog.vue + +* components/drive-window.vue + +* merge + +* fix + +* Service Workerのビルドにesbuildを使うようにする + +* return createEmptyNotification() + +* fix + +* i18n.ts + +* update + +* :v: + +* remove ts-loader + +* fix + +* fix + +* enhance: Service Workerを常に登録するように + +* pollEnded + +* URLをsw.jsに戻す + +* clean up + +* wip + +* wip + +* wip + +* wip + +* wip + +* wip + +* :v: + +* use import + +* fix + +* install rollup + +* use defineAsyncComponent. + +* fix emojilist + +* wip use defineAsyncComponent + +* popup(import -> popup(defineAsyncComponent(() => import + +* draggable? + +* fix init import + +* clean up + +* fix router + +* add comment + +* :v: + +* :v: + +* :v: + +* remove webpack + +* update vite + +* fix boot sequence + +* Revert "fix boot sequence" + +This reverts commit e893dbf37aed83bf9f12e427d98c78a7065b4a39. + +* revert boot import + +* never make two app div + +* ; + +* remove console.log + +* change clientEntry sequence + +* fix + +* Revert "fix" + +This reverts commit 12741b3d89950a31dbb1bb81477ddb27b0e9951a. + +* fix + +* add comment https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 + +* add log + +* add comment + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor(client): refactor settings/accounts to use Composition API ([#8604](https://github.com/orhun/git-cliff/issues/8604)) @@ -12463,57 +13329,57 @@ Co-Authored-By: tamaina <tamaina@hotmail.co.jp> - Enhance: Perform port diagnosis at startup only when Listen fails ([#8698](https://github.com/orhun/git-cliff/issues/8698)) -* Change port check - -* Comment: disableClustering - -* CHANGELOG - +* Change port check + +* Comment: disableClustering + +* CHANGELOG + * Smart message - Enhance: uniform theme color ([#8702](https://github.com/orhun/git-cliff/issues/8702)) -* enhance: make theme color format uniform - -All newly fetched instance theme colors will be uniformely formatted -as hashtag followed by 6 hexadecimal digits. - -Colors are checked for validity and invalid colors are not handled. - -* better input validation for own theme color - -* migration to unify theme color formats - -Fixes theme colors of other instances as well as the local instance. - -* add changelog entry - +* enhance: make theme color format uniform + +All newly fetched instance theme colors will be uniformely formatted +as hashtag followed by 6 hexadecimal digits. + +Colors are checked for validity and invalid colors are not handled. + +* better input validation for own theme color + +* migration to unify theme color formats + +Fixes theme colors of other instances as well as the local instance. + +* add changelog entry + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor(client): refactor admin/settings to use Composition API ([#8678](https://github.com/orhun/git-cliff/issues/8678)) - Enhance(MFM): limit large MFM ([#8540](https://github.com/orhun/git-cliff/issues/8540)) -* add CSS classes for zoom MFM - -* limit nesting of x2, x3, x4 MFM - -* simplify CSS calculation - -Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - +* add CSS classes for zoom MFM + +* limit nesting of x2, x3, x4 MFM + +* simplify CSS calculation + +Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> + Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> - Enhance: page image component with alt text ([#8634](https://github.com/orhun/git-cliff/issues/8634)) -* refactor to composition API - -* use existing image component - -This improves user experience because alt text is displayed correctly. - -* fix: correct image src - -* fix: defineProps - +* refactor to composition API + +* use existing image component + +This improves user experience because alt text is displayed correctly. + +* fix: correct image src + +* fix: defineProps + * fix - Refactor @@ -12522,33 +13388,33 @@ This improves user experience because alt text is displayed correctly. - Refactor: temporary files ([#8713](https://github.com/orhun/git-cliff/issues/8713)) -* simplify temporary files for thumbnails - -Because only a single file will be written to the directory, creating a -separate directory seems unnecessary. If only a temporary file is created, -the code from `createTemp` can be reused here as well. - -* refactor: deduplicate code for temporary files/directories - -To follow the DRY principle, the same code should not be duplicated -across different files. Instead an already existing function is used. - -Because temporary directories are also create in multiple locations, -a function for this is also newly added to reduce duplication. - -* fix: clean up identicon temp files - -The temporary files for identicons are not reused and can be deleted -after they are fully read. This condition is met when the stream is closed -and so the file can be cleaned up using the events API of the stream. - -* fix: ensure cleanup is called when download fails - -* fix: ensure cleanup is called in error conditions - -This covers import/export queue jobs and is mostly just wrapping all -code in a try...finally statement where the finally runs the cleanup. - +* simplify temporary files for thumbnails + +Because only a single file will be written to the directory, creating a +separate directory seems unnecessary. If only a temporary file is created, +the code from `createTemp` can be reused here as well. + +* refactor: deduplicate code for temporary files/directories + +To follow the DRY principle, the same code should not be duplicated +across different files. Instead an already existing function is used. + +Because temporary directories are also create in multiple locations, +a function for this is also newly added to reduce duplication. + +* fix: clean up identicon temp files + +The temporary files for identicons are not reused and can be deleted +after they are fully read. This condition is met when the stream is closed +and so the file can be cleaned up using the events API of the stream. + +* fix: ensure cleanup is called when download fails + +* fix: ensure cleanup is called in error conditions + +This covers import/export queue jobs and is mostly just wrapping all +code in a try...finally statement where the finally runs the cleanup. + * fix: use correct type instead of `any` - Refactor: use === @@ -12557,123 +13423,123 @@ code in a try...finally statement where the finally runs the cleanup. fix #8744 - Enhance: replace signin CAPTCHA with rate limit ([#8740](https://github.com/orhun/git-cliff/issues/8740)) -* enhance: rate limit works without signed in user - -* fix: make limit key required for limiter - -As before the fallback limiter key will be set from the endpoint name. - -* enhance: use limiter for signin - -* Revert "CAPTCHA求めるのは2fa認証が無効になっているときだけにした" - -This reverts commit 02a43a310f6ad0cc9e9beccc26e51ab5b339e15f. - -* Revert "feat: make captcha required when signin to improve security" - -This reverts commit b21b0580058c14532ff3f4033e2a9147643bfca6. - -* fix undefined reference - -* fix: better error message - +* enhance: rate limit works without signed in user + +* fix: make limit key required for limiter + +As before the fallback limiter key will be set from the endpoint name. + +* enhance: use limiter for signin + +* Revert "CAPTCHA求めるのは2fa認証が無効になっているときだけにした" + +This reverts commit 02a43a310f6ad0cc9e9beccc26e51ab5b339e15f. + +* Revert "feat: make captcha required when signin to improve security" + +This reverts commit b21b0580058c14532ff3f4033e2a9147643bfca6. + +* fix undefined reference + +* fix: better error message + * enhance: only handle prefix of IPv6 - Refactor: use css module at components/global/loading.vue ([#8750](https://github.com/orhun/git-cliff/issues/8750)) -* refactor: use css module at components/global/loading.vue - +* refactor: use css module at components/global/loading.vue + * rename class name to "root" - Refactor: improve code quality ([#8751](https://github.com/orhun/git-cliff/issues/8751)) -* remove unnecessary if - -`Array.prototype.some` already returns a boolean so an if to return -true or false is completely unnecessary in this case. - -* perf: use count instead of find - -When using `count` instead of `findOneBy`, the data is not -unnecessarily loaded. - -* remove duplicate null check - -The variable is checked for null in the lines above and the function -returns if so. Therefore, it can not be null at this point. - -* simplify `getJsonSchema` - -Because the assigned value is `null` and the used keys are only -shallow, use of `nestedProperty.set` seems inappropriate. Because the -value is not read, the initial for loop can be replaced by a `for..in` -loop. - -Since all keys will be assigned `null`, the condition of the ternary -expression in the nested function will always be true. Therefore the -recursion case will never happen. With this the nested function can be -eliminated. - -* remove duplicate condition - -The code above already checks `dragging` and returns if it is truthy. -Checking it again later is therefore unnecessary. - -To make this more obvious the `return` is removed in favour of using -an if...else construct. - -* remove impossible "unknown" time - -The `ago` variable will always be a number and all non-negative numbers -are already covered by other cases, the negative case is handled with +* remove unnecessary if + +`Array.prototype.some` already returns a boolean so an if to return +true or false is completely unnecessary in this case. + +* perf: use count instead of find + +When using `count` instead of `findOneBy`, the data is not +unnecessarily loaded. + +* remove duplicate null check + +The variable is checked for null in the lines above and the function +returns if so. Therefore, it can not be null at this point. + +* simplify `getJsonSchema` + +Because the assigned value is `null` and the used keys are only +shallow, use of `nestedProperty.set` seems inappropriate. Because the +value is not read, the initial for loop can be replaced by a `for..in` +loop. + +Since all keys will be assigned `null`, the condition of the ternary +expression in the nested function will always be true. Therefore the +recursion case will never happen. With this the nested function can be +eliminated. + +* remove duplicate condition + +The code above already checks `dragging` and returns if it is truthy. +Checking it again later is therefore unnecessary. + +To make this more obvious the `return` is removed in favour of using +an if...else construct. + +* remove impossible "unknown" time + +The `ago` variable will always be a number and all non-negative numbers +are already covered by other cases, the negative case is handled with `future` so there is no case when `unkown` could be achieved. - Enhance(dev): ask for log snippets - Refactor: use awaitAll to reduce duplication ([#8791](https://github.com/orhun/git-cliff/issues/8791)) -* refactor: use awaitAll to reduce duplication - -* fix lint - +* refactor: use awaitAll to reduce duplication + +* fix lint + * fix typo - Enhance: improve documentation for `/users/` endpoints ([#8790](https://github.com/orhun/git-cliff/issues/8790)) -* docs: category & description for reset password - -* docs: category & description for testing - -* docs: descriptions for groups endpoints - -* docs: descriptions for drive file endpoints - -* docs: descriptions for sw endpoints - -* docs: descriptions for user list endpoints - -* docs: descriptions & result type for gallery posts - -* docs: descriptions & result type for user endpoints - +* docs: category & description for reset password + +* docs: category & description for testing + +* docs: descriptions for groups endpoints + +* docs: descriptions for drive file endpoints + +* docs: descriptions for sw endpoints + +* docs: descriptions for user list endpoints + +* docs: descriptions & result type for gallery posts + +* docs: descriptions & result type for user endpoints + * docs: add return type for stats - Refactor: follow button ([#8789](https://github.com/orhun/git-cliff/issues/8789)) -* fix: display cancelling follow request - -* remove unnecessary branch - -The executed code is the same as in the else branch so this special -condition is unnecessary. - -* remove code duplication - -Use the same callback as later for updating these variables. - -* use $ref sugar - -* remove unused import - +* fix: display cancelling follow request + +* remove unnecessary branch + +The executed code is the same as in the else branch so this special +condition is unnecessary. + +* remove code duplication + +Use the same callback as later for updating these variables. + +* use $ref sugar + +* remove unused import + Co-authored-by: blackskye-sx <saul.newman@gmail.com> - Enhance(federation): use ActivityPub defined property in favour of proprietary property. ([#8787](https://github.com/orhun/git-cliff/issues/8787)) -* add activitypub `source` property - +* add activitypub `source` property + * parse MFM from new `source` attribute - Enhance(server): モデレーターであってもレートリミットを有効に @@ -12683,29 +13549,29 @@ Co-authored-by: blackskye-sx <saul.newman@gmail.com> - Enhance: Improve player detection in URL preview ([#8849](https://github.com/orhun/git-cliff/issues/8849)) -* enhance: Improve player detection in URL preview - +* enhance: Improve player detection in URL preview + * CHANGELOG - Refactor: チャットルームをComposition API化 ([#8850](https://github.com/orhun/git-cliff/issues/8850)) -* pick form - -* pick message - -* pick room - -* fix lint - -* fix scroll? - -* fix scroll.ts - -* fix directives/sticky-container - -* update global/sticky-container.vue - -* fix, :art: - +* pick form + +* pick message + +* pick room + +* fix lint + +* fix scroll? + +* fix scroll.ts + +* fix directives/sticky-container + +* update global/sticky-container.vue + +* fix, :art: + * test.1 - Refactor(client): Refine routing ([#8846](https://github.com/orhun/git-cliff/issues/8846)) @@ -12725,45 +13591,45 @@ Co-authored-by: blackskye-sx <saul.newman@gmail.com> - Refactor: simplify ap/show with DbResolver ([#8838](https://github.com/orhun/git-cliff/issues/8838)) -Using the existing code in DbResolver we can avoid separate code for -parsing the URIs in this endpoint. - +Using the existing code in DbResolver we can avoid separate code for +parsing the URIs in this endpoint. + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor(client): use composition api - Enhance: Redisをioredisに統一してIPv6サポート ([#8869](https://github.com/orhun/git-cliff/issues/8869)) -* Use ioredis, Supports IPv6 host - -https://github.com/misskey-dev/misskey/issues/8862 - -* Fix import - -* order - -* a - -* i - -* fix - -* flushdb - -* family - -* CHANGELOG - -* redis_version - +* Use ioredis, Supports IPv6 host + +https://github.com/misskey-dev/misskey/issues/8862 + +* Fix import + +* order + +* a + +* i + +* fix + +* flushdb + +* family + +* CHANGELOG + +* redis_version + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Refactor: remove unused import - Refactor: notification setting window composition API ([#8860](https://github.com/orhun/git-cliff/issues/8860)) -* refactor: notification setting window composition API - -* fix lint vue/require-valid-default-prop - +* refactor: notification setting window composition API + +* fix lint vue/require-valid-default-prop + * fix type - Refactor(client): extract tooltip logic of chart @@ -12777,12 +13643,12 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance(client): Enhance boot error display ([#8879](https://github.com/orhun/git-cliff/issues/8879)) -* Change boot error message - -* fix - -* :v: - +* Change boot error message + +* fix + +* :v: + * fix - Refactor: remove duplicate code ([#8895](https://github.com/orhun/git-cliff/issues/8895)) @@ -12853,63 +13719,63 @@ more accurately. - Enhance: Styled error screen ([#8946](https://github.com/orhun/git-cliff/issues/8946)) -* Styled error screen - -* Make details margin auto - -* Update boot.css - -* Replace fontawesome with tabler svg - -* Remove hr - -* Add new style to flush screen - -* Rename to `error.css` - -* Fix - -* Update base.pug - -* Finally fix! - -* Wrap details in `<code>` - -* Add style to flush - -* Fix - -* BIOS -> Repair tool - -* Fix - -* Typo - -* Adjust style - -* Adjust text - -* Flush -> Clear - -* Revert flush changes - -* Responsive - +* Styled error screen + +* Make details margin auto + +* Update boot.css + +* Replace fontawesome with tabler svg + +* Remove hr + +* Add new style to flush screen + +* Rename to `error.css` + +* Fix + +* Update base.pug + +* Finally fix! + +* Wrap details in `<code>` + +* Add style to flush + +* Fix + +* BIOS -> Repair tool + +* Fix + +* Typo + +* Adjust style + +* Adjust text + +* Flush -> Clear + +* Revert flush changes + +* Responsive + * Also hide splash - Enhance: show recipients of notes with specified visibility ([#8949](https://github.com/orhun/git-cliff/issues/8949)) -* enhance: reusable visibility component - -* rename renote tooltip component - -The tooltip that is used for renotes can be used in other cases as well. - -* add tooltip for specified recipients - -* add changelog entry - -* Update visibility.vue - +* enhance: reusable visibility component + +* rename renote tooltip component + +The tooltip that is used for renotes can be used in other cases as well. + +* add tooltip for specified recipients + +* add changelog entry + +* Update visibility.vue + Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance(server): tweak identicon generation @@ -12917,14 +13783,14 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance(sw): If receiving a push notification issued more than a day, ignore it. ([#8980](https://github.com/orhun/git-cliff/issues/8980)) -* enhance(sw): ignore old push notification - -* :v: - -* 半日 - -* !== - +* enhance(sw): ignore old push notification + +* :v: + +* 半日 + +* !== + * 1日 - Enhance(client): update themes @@ -12932,22 +13798,22 @@ Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> - Enhance: read theme color nodeinfo ([#8977](https://github.com/orhun/git-cliff/issues/8977)) -* provide theme color in nodeinfo metadata - -* read theme color from nodeinfo - -Prefer to read the theme color from the nodeinfo since it is more +* provide theme color in nodeinfo metadata + +* read theme color from nodeinfo + +Prefer to read the theme color from the nodeinfo since it is more performant than performing selector search on a DOM. - Refactor(client): rename menu(sidebar) -> navbar - Refactor(client): remove useCssModule ([#8999](https://github.com/orhun/git-cliff/issues/8999)) -* refactor(client): remove useCssModule() - -* use MkStickyContainer - -* Revert "use MkStickyContainer" - +* refactor(client): remove useCssModule() + +* use MkStickyContainer + +* Revert "use MkStickyContainer" + This reverts commit 639746786bb7e3342db9cbd3452854fc29aacf88. - Enhance(client): RSSティッカーで表示順序をシャッフルできるように @@ -13020,26 +13886,26 @@ Fix #8817 - Test: e2eテストがCIで失敗していた問題をいくつか修正 ([#8642](https://github.com/orhun/git-cliff/issues/8642)) -* test: indexeddbをテスト毎に初期化するように - -* fix: metaが無いときにfetch-metaを同時に呼ぶと死ぬことがある問題を修正 - +* test: indexeddbをテスト毎に初期化するように + +* fix: metaが無いときにfetch-metaを同時に呼ぶと死ぬことがある問題を修正 + * test: ログイン後のクライアント側処理を待たずにリロードされてログイン出来ないことがあったのを修正 - Test: `__dirname`はESModuleでは使えないので置き換えた ([#8626](https://github.com/orhun/git-cliff/issues/8626)) - Test: Nodeのカスタムローダーを直してテストが動くように ([#8625](https://github.com/orhun/git-cliff/issues/8625)) -* test: Nodeのカスタムローダーを直してテストが動くように - -* dev: mochaを呼ぶコマンドにNODE_ENV=testを追加 - -* Update packages/backend/test/loader.js - -Co-authored-by: Johann150 <johann@qwertqwefsday.eu> - -* chore: change export style in loader.js - +* test: Nodeのカスタムローダーを直してテストが動くように + +* dev: mochaを呼ぶコマンドにNODE_ENV=testを追加 + +* Update packages/backend/test/loader.js + +Co-authored-by: Johann150 <johann@qwertqwefsday.eu> + +* chore: change export style in loader.js + Co-authored-by: Johann150 <johann@qwertqwefsday.eu> - Test diff --git a/Dockerfile b/Dockerfile index d8671911e4..e11cb2bf44 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,19 @@ ## Install dev and compilation dependencies, build files -FROM node:19-alpine as build +FROM alpine:3.18 as build WORKDIR /calckey # Install compilation dependencies -RUN apk update -RUN apk add --no-cache --no-progress git alpine-sdk python3 rust cargo vips +RUN apk add --no-cache --no-progress git alpine-sdk python3 nodejs-current npm rust cargo vips + +# Copy only the cargo dependency-related files first, to cache efficiently +COPY packages/backend/native-utils/Cargo.toml packages/backend/native-utils/Cargo.toml +COPY packages/backend/native-utils/Cargo.lock packages/backend/native-utils/Cargo.lock +COPY packages/backend/native-utils/src/lib.rs packages/backend/native-utils/src/ +COPY packages/backend/native-utils/migration/Cargo.toml packages/backend/native-utils/migration/Cargo.toml +COPY packages/backend/native-utils/migration/src/lib.rs packages/backend/native-utils/migration/src/ + +# Install cargo dependencies +RUN cargo fetch --locked --manifest-path /calckey/packages/backend/native-utils/Cargo.toml # Copy only the dependency-related files first, to cache efficiently COPY package.json pnpm*.yaml ./ @@ -16,27 +25,31 @@ COPY packages/backend/native-utils/package.json packages/backend/native-utils/pa COPY packages/backend/native-utils/npm/linux-x64-musl/package.json packages/backend/native-utils/npm/linux-x64-musl/package.json COPY packages/backend/native-utils/npm/linux-arm64-musl/package.json packages/backend/native-utils/npm/linux-arm64-musl/package.json -# Configure corepack and pnpm -RUN corepack enable -RUN corepack prepare pnpm@latest --activate +# Configure corepack and pnpm, and install dev mode dependencies for compilation +RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm i --frozen-lockfile -# Install dev mode dependencies for compilation -RUN pnpm i --frozen-lockfile +# Copy in the rest of the native-utils rust files +COPY packages/backend/native-utils/.cargo packages/backend/native-utils/.cargo +COPY packages/backend/native-utils/build.rs packages/backend/native-utils/ +COPY packages/backend/native-utils/src packages/backend/native-utils/src/ +COPY packages/backend/native-utils/migration/src packages/backend/native-utils/migration/src/ -# Copy in the rest of the files, to compile from TS to JS +# Compile native-utils +RUN pnpm run --filter native-utils build + +# Copy in the rest of the files to compile COPY . ./ -RUN pnpm run build +RUN env NODE_ENV=production sh -c "pnpm run --filter '!native-utils' build && pnpm run gulp" -# Trim down the dependencies to only the prod deps +# Trim down the dependencies to only those for production RUN pnpm i --prod --frozen-lockfile - ## Runtime container -FROM node:19-alpine +FROM alpine:3.18 WORKDIR /calckey # Install runtime dependencies -RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip rust cargo +RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip nodejs-current COPY . ./ @@ -52,8 +65,9 @@ COPY --from=build /calckey/built /calckey/built COPY --from=build /calckey/packages/backend/built /calckey/packages/backend/built COPY --from=build /calckey/packages/backend/assets/instance.css /calckey/packages/backend/assets/instance.css COPY --from=build /calckey/packages/backend/native-utils/built /calckey/packages/backend/native-utils/built -COPY --from=build /calckey/packages/backend/native-utils/target /calckey/packages/backend/native-utils/target -RUN corepack enable +RUN corepack enable && corepack prepare pnpm@latest --activate +ENV NODE_ENV=production +VOLUME "/calckey/files" ENTRYPOINT [ "/sbin/tini", "--" ] CMD [ "pnpm", "run", "migrateandstart" ] diff --git a/README.md b/README.md index 796632be2d..f66d14a324 100644 --- a/README.md +++ b/README.md @@ -49,17 +49,26 @@ # 🥂 Links -- 💸 OpenCollective: <https://opencollective.com/Calckey> -- 💸 Liberapay: <https://liberapay.com/ThatOneCalculator> +### Want to get involved? Great! + +- If you have the means to, [donations](https://opencollective.com/Calckey) are a great way to keep us going. +- If you know how to program in TypeScript, Vue, or Rust, read the [contributing](./CONTRIBUTING.md) document. +- If you know a non-English language, translating Calckey on [Weblate](https://hosted.weblate.org/engage/calckey/) help bring Calckey to more people. No technical experience needed! +- Want to write/report about us, have any professional inquiries, or just have questions to ask? Contact us [here!](https://calckey.org/contact/) + +### All links + +- 🌐 Homepage: <https://calckey.org> +- 💸 Donations: + - OpenCollective: <https://opencollective.com/Calckey> + - Liberapay: <https://liberapay.com/ThatOneCalculator> - Donate publicly to get your name on the Patron list! - 🚢 Flagship server: <https://calckey.social> -- 📣 Official account: <https://i.calckey.cloud/@calckey> - 💁 Matrix support room: <https://matrix.to/#/#calckey:matrix.fedibird.com> -- 📜 Server list: <https://calckey.fediverse.observer/list> -- 📖 JoinFediverse Wiki: <https://joinfediverse.wiki/What_is_Calckey%3F> -- 🐋 Docker Hub: <https://hub.docker.com/r/thatonecalculator/calckey> +- 📣 Official account: <https://i.calckey.cloud/@calckey> +- 📜 Server list: <https://calckey.org/join> - ✍️ Weblate: <https://hosted.weblate.org/engage/calckey/> -- 📦 Yunohost: <https://github.com/YunoHost-Apps/calckey_ynh> +- ️️📬 Contact: <https://calckey.org/contact/> # 🌠 Getting started @@ -86,6 +95,7 @@ If you have access to a server that supports one of the sources below, I recomme - 🍀 Nginx (recommended) - 🦦 Caddy - 🪶 Apache +- ⚡ [libvips](https://www.libvips.org/) ### 😗 Optional dependencies @@ -97,7 +107,7 @@ If you have access to a server that supports one of the sources below, I recomme ### 🏗️ Build dependencies -- 🦀 At least [Rust](https://www.rust-lang.org/) v1.65.0 +- 🦀 At least [Rust](https://www.rust-lang.org/) v1.68.0 - 🦬 C/C++ compiler & build tools - `build-essential` on Debian/Ubuntu Linux - `base-devel` on Arch Linux diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl index b732fa5a4b..81009ed017 100644 --- a/chart/templates/_helpers.tpl +++ b/chart/templates/_helpers.tpl @@ -137,7 +137,9 @@ db: # Extra Connection options #extra: - # ssl: true + # ssl: + # host: localhost + # rejectUnauthorized: false # ┌─────────────────────┐ #───┘ Redis configuration └───────────────────────────────────── @@ -153,6 +155,10 @@ redis: pass: {{ .Values.redis.auth.password | quote }} #prefix: example-prefix #db: 1 + #user: default + #tls: + # host: localhost + # rejectUnauthorized: false # ┌─────────────────────┐ #───┘ Sonic configuration └───────────────────────────────────── diff --git a/cypress.config.ts b/cypress.config.ts index e390c41a54..25ff2aa075 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,12 +1,12 @@ -import { defineConfig } from 'cypress' +import { defineConfig } from "cypress"; export default defineConfig({ - e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index.js')(on, config) - }, - baseUrl: 'http://localhost:61812', - }, -}) + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require("./cypress/plugins/index.js")(on, config); + }, + baseUrl: "http://localhost:61812", + }, +}); diff --git a/cypress/e2e/basic.cy.js b/cypress/e2e/basic.cy.js index eb5195c4b2..f73a25efbc 100644 --- a/cypress/e2e/basic.cy.js +++ b/cypress/e2e/basic.cy.js @@ -1,4 +1,4 @@ -describe('Before setup instance', () => { +describe("Before setup instance", () => { beforeEach(() => { cy.resetState(); }); @@ -9,31 +9,31 @@ describe('Before setup instance', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('setup instance', () => { - cy.visit('/'); + it("setup instance", () => { + cy.visit("/"); - cy.intercept('POST', '/api/admin/accounts/create').as('signup'); - - cy.get('[data-cy-admin-username] input').type('admin'); - cy.get('[data-cy-admin-password] input').type('admin1234'); - cy.get('[data-cy-admin-ok]').click(); + cy.intercept("POST", "/api/admin/accounts/create").as("signup"); + + cy.get("[data-cy-admin-username] input").type("admin"); + cy.get("[data-cy-admin-password] input").type("admin1234"); + cy.get("[data-cy-admin-ok]").click(); // なぜか動かない //cy.wait('@signup').should('have.property', 'response.statusCode'); - cy.wait('@signup'); - }); + cy.wait("@signup"); + }); }); -describe('After setup instance', () => { +describe("After setup instance", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); }); afterEach(() => { @@ -42,34 +42,34 @@ describe('After setup instance', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('signup', () => { - cy.visit('/'); + it("signup", () => { + cy.visit("/"); - cy.intercept('POST', '/api/signup').as('signup'); + cy.intercept("POST", "/api/signup").as("signup"); - cy.get('[data-cy-signup]').click(); - cy.get('[data-cy-signup-username] input').type('alice'); - cy.get('[data-cy-signup-password] input').type('alice1234'); - cy.get('[data-cy-signup-password-retype] input').type('alice1234'); - cy.get('[data-cy-signup-submit]').click(); + cy.get("[data-cy-signup]").click(); + cy.get("[data-cy-signup-username] input").type("alice"); + cy.get("[data-cy-signup-password] input").type("alice1234"); + cy.get("[data-cy-signup-password-retype] input").type("alice1234"); + cy.get("[data-cy-signup-submit]").click(); - cy.wait('@signup'); - }); + cy.wait("@signup"); + }); }); -describe('After user signup', () => { +describe("After user signup", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); }); afterEach(() => { @@ -78,51 +78,53 @@ describe('After user signup', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('signin', () => { - cy.visit('/'); + it("signin", () => { + cy.visit("/"); - cy.intercept('POST', '/api/signin').as('signin'); + cy.intercept("POST", "/api/signin").as("signin"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type('alice'); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type("alice"); // Enterキーでサインインできるかの確認も兼ねる - cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + cy.get("[data-cy-signin-password] input").type("alice1234{enter}"); - cy.wait('@signin'); - }); + cy.wait("@signin"); + }); - it('suspend', function() { - cy.request('POST', '/api/admin/suspend-user', { + it("suspend", function () { + cy.request("POST", "/api/admin/suspend-user", { i: this.admin.token, userId: this.alice.id, }); - cy.visit('/'); + cy.visit("/"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type('alice'); - cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type("alice"); + cy.get("[data-cy-signin-password] input").type("alice1234{enter}"); // TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする - cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi); + cy.contains( + /アカウントが凍結されています|This account has been suspended due to/gi, + ); }); }); -describe('After user singed in', () => { +describe("After user singed in", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); - cy.login('alice', 'alice1234'); + cy.login("alice", "alice1234"); }); afterEach(() => { @@ -131,17 +133,17 @@ describe('After user singed in', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.get('[data-cy-open-post-form]').should('be.visible'); - }); + it("successfully loads", () => { + cy.get("[data-cy-open-post-form]").should("be.visible"); + }); - it('note', () => { - cy.get('[data-cy-open-post-form]').click(); - cy.get('[data-cy-post-form-text]').type('Hello, Misskey!'); - cy.get('[data-cy-open-post-form-submit]').click(); + it("note", () => { + cy.get("[data-cy-open-post-form]").click(); + cy.get("[data-cy-post-form-text]").type("Hello, Misskey!"); + cy.get("[data-cy-open-post-form-submit]").click(); - cy.contains('Hello, Misskey!'); - }); + cy.contains("Hello, Misskey!"); + }); }); // TODO: 投稿フォームの公開範囲指定のテスト diff --git a/cypress/e2e/widgets.cy.js b/cypress/e2e/widgets.cy.js index 9eea010bde..e3c9326db8 100644 --- a/cypress/e2e/widgets.cy.js +++ b/cypress/e2e/widgets.cy.js @@ -1,14 +1,14 @@ -describe('After user signed in', () => { +describe("After user signed in", () => { beforeEach(() => { cy.resetState(); - cy.viewport('macbook-16'); + cy.viewport("macbook-16"); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); - cy.login('alice', 'alice1234'); + cy.login("alice", "alice1234"); }); afterEach(() => { @@ -17,47 +17,47 @@ describe('After user signed in', () => { cy.wait(1000); }); - it('widget edit toggle is visible', () => { - cy.get('.mk-widget-edit').should('be.visible'); - }); + it("widget edit toggle is visible", () => { + cy.get(".mk-widget-edit").should("be.visible"); + }); - it('widget select should be visible in edit mode', () => { - cy.get('.mk-widget-edit').click(); - cy.get('.mk-widget-select').should('be.visible'); - }); + it("widget select should be visible in edit mode", () => { + cy.get(".mk-widget-edit").click(); + cy.get(".mk-widget-select").should("be.visible"); + }); - it('first widget should be removed', () => { - cy.get('.mk-widget-edit').click(); - cy.get('.customize-container:first-child .remove._button').click(); - cy.get('.customize-container').should('have.length', 2); + it("first widget should be removed", () => { + cy.get(".mk-widget-edit").click(); + cy.get(".customize-container:first-child .remove._button").click(); + cy.get(".customize-container").should("have.length", 2); }); function buildWidgetTest(widgetName) { it(`${widgetName} widget should get added`, () => { - cy.get('.mk-widget-edit').click(); - cy.get('.mk-widget-select select').select(widgetName, { force: true }); - cy.get('.bg._modalBg.transparent').click({ multiple: true, force: true }); - cy.get('.mk-widget-add').click({ force: true }); - cy.get(`.mkw-${widgetName}`).should('exist'); + cy.get(".mk-widget-edit").click(); + cy.get(".mk-widget-select select").select(widgetName, { force: true }); + cy.get(".bg._modalBg.transparent").click({ multiple: true, force: true }); + cy.get(".mk-widget-add").click({ force: true }); + cy.get(`.mkw-${widgetName}`).should("exist"); }); } - buildWidgetTest('memo'); - buildWidgetTest('notifications'); - buildWidgetTest('timeline'); - buildWidgetTest('calendar'); - buildWidgetTest('rss'); - buildWidgetTest('trends'); - buildWidgetTest('clock'); - buildWidgetTest('activity'); - buildWidgetTest('photos'); - buildWidgetTest('digitalClock'); - buildWidgetTest('federation'); - buildWidgetTest('postForm'); - buildWidgetTest('slideshow'); - buildWidgetTest('serverMetric'); - buildWidgetTest('onlineUsers'); - buildWidgetTest('jobQueue'); - buildWidgetTest('button'); - buildWidgetTest('aiscript'); + buildWidgetTest("memo"); + buildWidgetTest("notifications"); + buildWidgetTest("timeline"); + buildWidgetTest("calendar"); + buildWidgetTest("rss"); + buildWidgetTest("trends"); + buildWidgetTest("clock"); + buildWidgetTest("activity"); + buildWidgetTest("photos"); + buildWidgetTest("digitalClock"); + buildWidgetTest("federation"); + buildWidgetTest("postForm"); + buildWidgetTest("slideshow"); + buildWidgetTest("serverMetric"); + buildWidgetTest("onlineUsers"); + buildWidgetTest("jobQueue"); + buildWidgetTest("button"); + buildWidgetTest("aiscript"); }); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js index aa9918d215..3a4b6deb18 100644 --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -16,6 +16,6 @@ * @type {Cypress.PluginConfig} */ module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +}; diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 95bfcf6855..3fe95b93d0 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -24,32 +24,34 @@ // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -Cypress.Commands.add('resetState', () => { - cy.window(win => { - win.indexedDB.deleteDatabase('keyval-store'); +Cypress.Commands.add("resetState", () => { + cy.window((win) => { + win.indexedDB.deleteDatabase("keyval-store"); }); - cy.request('POST', '/api/reset-db').as('reset'); - cy.get('@reset').its('status').should('equal', 204); + cy.request("POST", "/api/reset-db").as("reset"); + cy.get("@reset").its("status").should("equal", 204); cy.reload(true); }); -Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => { - const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup'; +Cypress.Commands.add("registerUser", (username, password, isAdmin = false) => { + const route = isAdmin ? "/api/admin/accounts/create" : "/api/signup"; - cy.request('POST', route, { + cy.request("POST", route, { username: username, password: password, - }).its('body').as(username); + }) + .its("body") + .as(username); }); -Cypress.Commands.add('login', (username, password) => { - cy.visit('/'); +Cypress.Commands.add("login", (username, password) => { + cy.visit("/"); - cy.intercept('POST', '/api/signin').as('signin'); + cy.intercept("POST", "/api/signin").as("signin"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type(username); - cy.get('[data-cy-signin-password] input').type(`${password}{enter}`); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type(username); + cy.get("[data-cy-signin-password] input").type(`${password}{enter}`); - cy.wait('@signin').as('signedIn'); + cy.wait("@signin").as("signedIn"); }); diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js index 9185be344c..961c6ac888 100644 --- a/cypress/support/e2e.js +++ b/cypress/support/e2e.js @@ -14,19 +14,21 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands' +import "./commands"; // Alternatively you can use CommonJS syntax: // require('./commands') -Cypress.on('uncaught:exception', (err, runnable) => { - if ([ - // Chrome - 'ResizeObserver loop limit exceeded', +Cypress.on("uncaught:exception", (err, runnable) => { + if ( + [ + // Chrome + "ResizeObserver loop limit exceeded", - // Firefox - 'ResizeObserver loop completed with undelivered notifications', - ].some(msg => err.message.includes(msg))) { + // Firefox + "ResizeObserver loop completed with undelivered notifications", + ].some((msg) => err.message.includes(msg)) + ) { return false; } }); diff --git a/docker-compose.yml b/docker-compose.yml index d6ad26a059..abb1882ea5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,8 +19,6 @@ services: environment: NODE_ENV: production volumes: - - ./.cargo-cache:/root/.cargo - - ./.cargo-target:/calckey/packages/backend/native-utils/target - ./files:/calckey/files - ./.config:/calckey/.config:ro diff --git a/docs/api-doc.md b/docs/api-doc.md new file mode 100644 index 0000000000..4051144de1 --- /dev/null +++ b/docs/api-doc.md @@ -0,0 +1,5 @@ +# API Documentation + +You can find interactive API documentation at any Calckey instance. https://calckey.social/api-doc + +You can also find auto-generated documentation for calckey-js [here](../packages/calckey-js/markdown/calckey-js.md). diff --git a/issue_template/bug.yaml b/issue_template/bug.yaml index c7e2f6b788..d0c80d7534 100644 --- a/issue_template/bug.yaml +++ b/issue_template/bug.yaml @@ -1,18 +1,28 @@ -name: Bug Report +name: 🐛 Bug Report about: File a bug report title: "[Bug]: " +blank_issues_enabled: true +contact_links: + - name: 💁 Support Matrix + url: https://matrix.to/#/%23calckey:matrix.fedibird.com + about: Having trouble with deployment? Ask the support chat. + - name: 🔒 Resposible Disclosure + url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md + about: Found a security vulnerability? Please disclose it responsibly. body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this bug report! + 💖 Thanks for taking the time to fill out this bug report! + 💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com) + 🔒 Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md) + 🤝 By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) - type: textarea id: what-happened attributes: label: What happened? description: Please give us a brief description of what happened. placeholder: Tell us what you see! - value: "A bug happened!" validations: required: true - type: textarea @@ -21,7 +31,6 @@ body: label: What did you expect to happen? description: Please give us a brief description of what you expected to happen. placeholder: Tell us what you wish happened! - value: "Instead of x, y should happen instead!" validations: required: true - type: input @@ -29,7 +38,7 @@ body: attributes: label: Version description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. - placeholder: Calckey Version 13.0.4 + placeholder: v13.1.4.1 validations: required: true - type: input @@ -37,15 +46,26 @@ body: attributes: label: Instance description: What instance of calckey are you using? - placeholder: stop.voring.me + placeholder: calckey.social validations: required: false - type: dropdown - id: browsers + id: issue-type attributes: - label: What browser are you using? + label: What type of issue is this? + description: If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. multiple: false options: + - Client-side + - Server-side + - Other (Please Specify) + - type: dropdown + id: browsers + attributes: + label: What browser are you using? (Client-side issues only) + multiple: false + options: + - N/A - Firefox - Chrome - Brave @@ -54,6 +74,50 @@ body: - Safari - Microsoft Edge - Other (Please Specify) + - type: dropdown + id: device + attributes: + label: What operating system are you using? (Client-side issues only) + multiple: false + options: + - N/A + - Windows + - MacOS + - Linux + - Android + - iOS + - Other (Please Specify) + - type: dropdown + id: deplotment-method + attributes: + label: How do you deploy Calckey on your server? (Server-side issues only) + multiple: false + options: + - N/A + - Manual + - Ubuntu Install Script + - Docker Compose + - Docker Prebuilt Image + - Helm Chart + - YunoHost + - AUR Package + - Other (Please Specify) + - type: dropdown + id: operating-system + attributes: + label: What operating system are you using? (Server-side issues only) + multiple: false + options: + - N/A + - Ubuntu >= 22.04 + - Ubuntu < 22.04 + - Debian + - Arch + - RHEL (CentOS/AlmaLinux/Rocky Linux) + - FreeBSD + - OpenBSD + - Android + - Other (Please Specify) - type: textarea id: logs attributes: diff --git a/issue_template/feature.yaml b/issue_template/feature.yaml index 455125ea7c..9797113276 100644 --- a/issue_template/feature.yaml +++ b/issue_template/feature.yaml @@ -1,18 +1,28 @@ -name: Feature Request +name: ✨ Feature Request about: Request a Feature title: "[Feature]: " +blank_issues_enabled: true +contact_links: + - name: 💁 Support Matrix + url: https://matrix.to/#/%23calckey:matrix.fedibird.com + about: Having trouble with deployment? Ask the support chat. + - name: 🔒 Resposible Disclosure + url: https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md + about: Found a security vulnerability? Please disclose it responsibly. body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this feature request! + 💖 Thanks for taking the time to fill out this feature request! + 💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/%23calckey:matrix.fedibird.com) + 🔒 Found a security vulnerability? [Please disclose it responsibly.](https://codeberg.org/calckey/calckey/src/branch/develop/SECURITY.md) + 🤝 By submitting this issue, you agree to follow our [Contribution Guidelines.](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md) - type: textarea id: what-feature attributes: label: What feature would you like implemented? description: Please give us a brief description of what you'd like. placeholder: Tell us what you want! - value: "x feature would be great!" validations: required: true - type: textarea @@ -21,7 +31,6 @@ body: label: Why should we add this feature? description: Please give us a brief description of why your feature is important. placeholder: Tell us why you want this feature! - value: "x feature is super useful because y!" validations: required: true - type: input @@ -29,7 +38,7 @@ body: attributes: label: Version description: What version of calckey is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. - placeholder: Calckey Version 13.0.4 + placeholder: Calckey Version 13.1.4.1 validations: required: true - type: input @@ -37,7 +46,7 @@ body: attributes: label: Instance description: What instance of calckey are you using? - placeholder: stop.voring.me + placeholder: calckey.social validations: required: false - type: checkboxes diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 20e67a0971..a269a0d008 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -136,7 +136,7 @@ smtpUser: "Nom d'usuari" smtpPass: "Contrasenya" user: "Usuari" searchByGoogle: "Cercar" -file: "Fitxers" +file: "Fitxer" _email: _follow: title: "Tens un nou seguidor" @@ -325,11 +325,31 @@ _2fa: per protegir encara més el vostre compte. step4: A partir d'ara, qualsevol intent d'inici de sessió futur demanarà aquest token d'inici de sessió. - registerSecurityKey: Registra una clau de seguretat + registerSecurityKey: Registrar una clau de seguretat o d'accés step1: En primer lloc, instal·la una aplicació d'autenticació (com ara {a} o {b}) al dispositiu. step2: A continuació, escaneja el codi QR que es mostra en aquesta pantalla. step3: Introdueix el token que t'ha proporcionat l'aplicació per finalitzar la configuració. + step3Title: Introduïu un codi d'autenticació + chromePasskeyNotSupported: Les claus de pas de Chrome actualment no s'admeten. + securityKeyName: Introduïu un nom de clau + removeKey: Suprimeix la clau de seguretat + removeKeyConfirm: Vols suprimir la clau {name}? + renewTOTP: Tornar a configurar l'aplicació d'autenticació + renewTOTPOk: Reconfigurar + renewTOTPCancel: Cancel·lar + step2Click: Fer clic en aquest codi QR us permetrà registrar 2FA a la vostra clau + de seguretat o aplicació d'autenticació del telèfon. + securityKeyNotSupported: El vostre navegador no admet claus de seguretat. + registerTOTPBeforeKey: Configureu una aplicació d'autenticació per registrar una + clau de seguretat o de passi. + tapSecurityKey: Si us plau, seguiu el vostre navegador per registrar la clau de + seguretat o d'accés + renewTOTPConfirm: Això farà que els codis de verificació de l'aplicació anterior + deixin de funcionar + whyTOTPOnlyRenew: L’aplicació d’autenticació no es pot eliminar sempre que es hi + hagi una clau de seguretat registrada. + token: Token 2FA _widgets: notifications: "Notificacions" timeline: "Línia de temps" @@ -366,12 +386,13 @@ _cw: chars: '{count} caràcters' _visibility: followers: "Seguidors" - publicDescription: La teva publicació serà visible per a tots els usuaris + publicDescription: La teva publicació serà visible per a totes les línies de temps + públiques localOnly: Només Local specified: Directe home: Sense llistar homeDescription: Publica només a la línea de temps local - followersDescription: Fes visible només per als teus seguidors + followersDescription: Fes visible només per als teus seguidors i usuaris mencionats specifiedDescription: Fer visible només per a usuaris determinats public: Públic localOnlyDescription: No és visible per als usuaris remots @@ -988,7 +1009,7 @@ avoidMultiCaptchaConfirm: Fent servir diferents sistemes de Captcha pot causar i antennas: Antenes enableEmojiReactions: Activa reaccions amb emojis blockThisInstance: Bloqueja aquest servidor -registration: Registre +registration: Registra't showEmojisInReactionNotifications: Mostra els emojis a les notificacions de les reaccions renoteMute: Silencia els impulsos renoteUnmute: Treu el silenci als impulsos @@ -1035,7 +1056,7 @@ recentlyRegisteredUsers: Usuaris registrats fa poc recentlyDiscoveredUsers: Nous suaris descoberts administrator: Administrador token: Token -registerSecurityKey: Registra una clau de seguretat +registerSecurityKey: Registreu una clau de seguretat securityKeyName: Nom clau lastUsed: Feta servir per última vegada unregister: Anul·lar el registre @@ -1580,6 +1601,8 @@ _aboutMisskey: morePatrons: També agraïm el suport de molts altres ajudants que no figuren aquí. Gràcies! 🥰 patrons: Mecenes de Calckey + patronsList: Llistats cronològicament, no per la quantitat donada. Fes una donació + amb l'enllaç de dalt per veure el teu nom aquí! unknown: Desconegut pageLikesCount: Nombre de pàgines amb M'agrada youAreRunningUpToDateClient: Estás fent servir la versió del client més nova. @@ -1649,9 +1672,9 @@ popout: Apareixa volume: Volum objectStorageUseSSLDesc: Desactiva això si no fas servir HTTPS per les connexions API -objectStorageUseProxy: Conectarse mitjançant un Proxy +objectStorageUseProxy: Connectar-se mitjançant un Proxy objectStorageUseProxyDesc: Desactiva això si no faràs servir un servidor Proxy per - conexions API + conexions amb l'API objectStorageSetPublicRead: Fixar com a "public-read" al pujar serverLogs: Registres del servidor deleteAll: Esborrar tot @@ -1767,7 +1790,7 @@ createNew: Crear una nova optional: Opcional jumpToSpecifiedDate: Vés a una data concreta showingPastTimeline: Ara es mostra un línea de temps antiga -clear: Tornar +clear: Netejar markAllAsRead: Marcar tot com a llegit recentPosts: Pàgines recents noMaintainerInformationWarning: La informació de l'administrador no està configurada. @@ -2012,11 +2035,12 @@ _auth: shareAccessAsk: Estàs segur que vols autoritzar aquesta aplicació per accedir al teu compte? shareAccess: Vols autoritzar "{name}" per accedir a aquest compte? - permissionAsk: Aquesta aplicació sol·licita els següents permisos + permissionAsk: 'Aquesta aplicació sol·licita els següents permisos:' callback: Tornant a l'aplicació denied: Accés denegat pleaseGoBack: Si us plau, torneu a l'aplicació - copyAsk: Posa el següent codi d'autorització a l'aplicació + copyAsk: "Posa el següent codi d'autorització a l'aplicació:" + allPermissions: Accés complet al compte _weekday: wednesday: Dimecres saturday: Dissabte @@ -2041,7 +2065,7 @@ _relayStatus: rejected: Rebutjat deleted: Eliminat editNote: Edita la nota -edited: Editat +edited: 'Editat a {date} {time}' findOtherInstance: Cercar un altre servidor signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactivades, però sempre podeu registrar-vos en un altre servidor. Si teniu un codi d'invitació @@ -2060,11 +2084,7 @@ _experiments: alpha: Alfa beta: Beta release: Publicà - enablePostEditing: Activà l'edició de publicacions title: Experiments - postEditingCaption: Mostra l'opció perquè els usuaris editin les seves publicacions - mitjançant el menú d'opcions de publicació, i permet rebre publicacions editades - d'altres servidors. enablePostImports: Activar l'importació de publicacions postImportsCaption: Permet els usuaris importar publicacions desde comptes a Calckey, Misskey, Mastodon, Akkoma i Pleroma. Pot fer que el servidor vagi més lent durant @@ -2107,3 +2127,18 @@ _filters: image: Imatge video: Vídeo audio: Àudio +_dialog: + charactersExceeded: "S'han superat el màxim de caràcters! Actual: {current}/Límit: + {max}" + charactersBelow: 'No hi ha caràcters suficients! Corrent: {current}/Limit: {min}' +removeReaction: Elimina la teva reacció +reactionPickerSkinTone: To de pell d'emoji preferit +alt: ALT +_skinTones: + light: Clar + mediumLight: Clar Mitx + medium: Mitx + mediumDark: Fosc Mitx + dark: Fosc + yellow: Groc +swipeOnMobile: Permet lliscar entre pàgines diff --git a/locales/cs-CZ.yml b/locales/cs-CZ.yml index 1fe16135e6..e6394f3ee6 100644 --- a/locales/cs-CZ.yml +++ b/locales/cs-CZ.yml @@ -963,7 +963,7 @@ disablingTimelinesInfo: Administrátoři a moderátoři budou vždy mít příst časovým osám, i pokud jsou vypnuté. deleted: Vymazáno editNote: Upravit poznámku -edited: Upraveno +edited: 'Upraveno dne {date} {time}' silencedInstancesDescription: Vypište hostnames instancí, které chcete ztlumit. Účty v uvedených instancích jsou považovány za "ztlumené", mohou pouze zadávat požadavky na sledování a nemohou zmiňovat místní účty, pokud nejsou sledovány. Na blokované diff --git a/locales/da-DK.yml b/locales/da-DK.yml index 6e83808914..f0e6523ebb 100644 --- a/locales/da-DK.yml +++ b/locales/da-DK.yml @@ -83,7 +83,7 @@ deleteAndEditConfirm: Er du sikker på at du vil slet denne opslag og ændre det vil tabe alle reaktioner, forstærkninger og svarer indenfor denne opslag. editNote: Ændre note deleted: Slettet -edited: Ændret +edited: 'Ændret den {date} {time}' sendMessage: Send en besked youShouldUpgradeClient: Til at vise denne side, vær sød at refresh til at opdatere din brugerenhed. diff --git a/locales/de-DE.yml b/locales/de-DE.yml index e8615b6f58..9e3a07654f 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -693,8 +693,8 @@ abuseReported: "Deine Meldung wurde versendet. Vielen Dank." reporter: "Melder" reporteeOrigin: "Herkunft des Gemeldeten" reporterOrigin: "Herkunft des Meldenden" -forwardReport: "Einen Meldung zusätzlich an den mit-beteiligten Server senden" -forwardReportIsAnonymous: "Anstelle Ihres Nutzerkontos wird ein anonymes Systemkonto +forwardReport: "Meldung auch an den mit-beteiligten Server weiterleiten" +forwardReportIsAnonymous: "Anstelle deines Nutzerkontos wird ein anonymes Systemkonto als Hinweisgeber auf dem mit-beteiligten Server angezeigt." send: "Senden" abuseMarkAsResolved: "Meldung als gelöst markieren" @@ -812,7 +812,7 @@ useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen" typingUsers: "{users} ist/sind am schreiben" jumpToSpecifiedDate: "Zu bestimmtem Datum springen" showingPastTimeline: "Es wird eine alte Timeline angezeigt" -clear: "Zurückkehren" +clear: "Leeren" markAllAsRead: "Alle als gelesen markieren" goBack: "Zurück" unlikeConfirm: "\"Gefällt mir\" wirklich entfernen?" @@ -1189,6 +1189,8 @@ _mfm: stop: MFM anhalten warn: MFM können schnell bewegte oder anderweitig auffallende Animationen enthalten alwaysPlay: Alle animierten MFM immer automatisch abspielen + advancedDescription: Wenn diese Funktion deaktiviert ist, können nur einfache Formatierungen + vorgenommen werden, es sei denn, animiertes MFM ist aktiviert _instanceTicker: none: "Nie anzeigen" remote: "Für Nutzer eines anderen Servers anzeigen" @@ -1356,8 +1358,8 @@ _tutorial: der/die auf diesem Server registriert ist." step5_5: "Die Social-Timeline {icon} ist eine Kombination aus der Home-Timeline und der Local-Timeline." - step5_6: "In der {icon} \"Favoriten\"-Timeline können sie Beiträge von Servern sehen, - die von den Server-Administratoren vorgeschlagen werden." + step5_6: "In der Empfohlen-Timeline {icon} kannst du Posts sehen, die von den Admins + vorgeschlagen wurden." step5_7: "In der {icon} Global-Timeline können Sie Beiträge von allen verknüpften Servern aus dem Fediverse sehen." step6_1: "Also, was ist das hier?" @@ -1383,6 +1385,25 @@ _2fa: securityKeyInfo: "Du kannst neben Fingerabdruck- oder PIN-Authentifizierung auf deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels einrichten." + step3Title: Gib deinen Authentifizierungscode ein + renewTOTPOk: Neu konfigurieren + securityKeyNotSupported: Dein Browser unterstützt Hardware-Security-Keys nicht. + chromePasskeyNotSupported: Chrome Passkeys werden momentan nicht unterstützt. + renewTOTP: Konfiguriere deine Authenticator App neu + renewTOTPCancel: Abbrechen + tapSecurityKey: Bitte folge den Anweisungen deines Browsers, um einen Hardware-Security-Key + oder einen Passkey zu registrieren + removeKey: Entferne deinen Hardware-Security-Key + removeKeyConfirm: Möchtest du wirklich deinen Key mit der Bezeichnung {name} löschen? + renewTOTPConfirm: Das wird dazu führen, dass du Verifizierungscodes deiner vorherigen + Authenticator App nicht mehr nutzen kannst + whyTOTPOnlyRenew: Die Authentificator App kann nicht entfernt werden, solange ein + Hardware-Security-Key registriert ist. + step2Click: Ein Klick auf diesen QR-Code erlaubt es dir eine 2FA-Methode zu deinem + Security Key oder deiner Authenticator App hinzuzufügen. + registerTOTPBeforeKey: Bitte registriere eine Authentificator App, um einen Hardware-Security-Key + oder einen Passkey zu nutzen. + securityKeyName: Gib einen Namen für den Key ein _permissions: "read:account": "Deine Nutzerkontoinformationen lesen" "write:account": "Deine Nutzerkontoinformationen bearbeiten" @@ -1451,7 +1472,7 @@ _widgets: trends: "Trends" clock: "Uhr" rss: "RSS-Reader" - rssTicker: "RSS-Laufschrift (Ticker)" + rssTicker: "RSS Ticker" activity: "Aktivität" photos: "Fotos" digitalClock: "Digitaluhr" @@ -1962,8 +1983,8 @@ renoteMute: Boosts stummschalten renoteUnmute: Stummschaltung von Boosts aufheben noInstances: Keine Server gefunden privateModeInfo: Wenn diese Option aktiviert ist, können nur als vertrauenswürdig - eingestufte Server mit diesem Server verknüpft werden. Alle Beiträge werden für - die Öffentlichkeit verborgen. + eingestufte Server mit diesem Server kommunizieren. Alle Beiträge werden für die + Öffentlichkeit verborgen. allowedInstances: Vertrauenswürdige Server selectInstance: Wähle einen Server aus silencedInstancesDescription: Liste die Hostnamen der Server auf, die du stummschalten @@ -1972,7 +1993,7 @@ silencedInstancesDescription: Liste die Hostnamen der Server auf, die du stummsc wenn sie nicht gefolgt werden. Dies wirkt sich nicht auf die blockierten Server aus. editNote: Beitrag bearbeiten -edited: Bearbeitet +edited: 'Bearbeitet um {date} {time}' silenceThisInstance: Diesen Server stummschalten silencedInstances: Stummgeschaltete Server silenced: Stummgeschaltet @@ -2074,11 +2095,11 @@ jumpToPrevious: Zum Vorherigen springen silencedWarning: Diese Meldung wird angezeigt, weil diese Nutzer von Servern stammen, die Ihr Administrator abgeschaltet hat, so dass es sich möglicherweise um Spam handelt. _experiments: - enablePostEditing: Beitragsbearbeitung ermöglichen title: Funktionstests - postEditingCaption: Zeigt die Option für Nutzer an, ihre bestehenden Beiträge über - das Menü "Beitragsoptionen" zu bearbeiten enablePostImports: Beitragsimporte aktivieren + postImportsCaption: Erlaubt es Nutzer:innen ihre Posts von alten Calckey, Misskey, + Mastodon, Akkoma und Pleroma Accounts zu importieren. Bei Engpässen in der Warteschlange + kann es zu Verlangsamungen beim Laden während des Imports kommen. noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie die Funktion von Calckey stört. indexFrom: Indexieren ab Beitragskennung aufwärts @@ -2109,6 +2130,23 @@ _filters: withFile: Mit Datei fromDomain: Von Domain notesBefore: Beiträge vor + followingOnly: Nur Folgende isBot: Dieses Konto ist ein Bot isModerator: Moderator isAdmin: Administrator +_dialog: + charactersExceeded: 'Maximale Anzahl an Zeichen aufgebraucht! Limit: {current} / + {max}' + charactersBelow: Nicht genug Zeichen! Du hast aktuell {current} von {min} Zeichen +searchPlaceholder: Calckey durchsuchen +antennasDesc: "Antennen zeigen neue Posts an, die deinen definierten Kriterien entsprechen!\n + Sie können von der Timeline-Seite aufgerufen werden." +isPatron: Calckey Patron +removeReaction: Entferne deine Reaktion +listsDesc: Listen lassen dich Timelines mit bestimmten Nutzer:innen erstellen. Sie + können von der Timeline-Seite erreicht werden. +clipsDesc: Clips sind wie teilbare, kategorisierte Lesezeichen. Du kannst Clips vom + Menü individueller Posts aus erstellen. +channelFederationWarn: Kanäle föderieren noch nicht zu anderen Servern +reactionPickerSkinTone: Bevorzugte Emoji-Hautfarbe +swipeOnMobile: Wischen zwischen den Seiten erlauben diff --git a/locales/en-US.yml b/locales/en-US.yml index b2bc4e7146..c6c442df7c 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -52,7 +52,7 @@ deleteAndEdit: "Delete and edit" deleteAndEditConfirm: "Are you sure you want to delete this post and edit it? You will lose all reactions, boosts and replies to it." editNote: "Edit note" -edited: "Edited" +edited: "Edited at {date} {time}" addToList: "Add to list" sendMessage: "Send a message" copyUsername: "Copy username" @@ -123,6 +123,7 @@ clickToShow: "Click to show" sensitive: "NSFW" add: "Add" reaction: "Reactions" +removeReaction: "Remove your reaction" enableEmojiReactions: "Enable emoji reactions" showEmojisInReactionNotifications: "Show emojis in reaction notifications" reactionSetting: "Reactions to show in the reaction picker" @@ -829,7 +830,7 @@ useReactionPickerForContextMenu: "Open reaction picker on right-click" typingUsers: "{users} is typing" jumpToSpecifiedDate: "Jump to specific date" showingPastTimeline: "Currently displaying an old timeline" -clear: "Return" +clear: "Clear" markAllAsRead: "Mark all as read" goBack: "Back" unlikeConfirm: "Really remove your like?" @@ -940,6 +941,7 @@ deleteAccountConfirm: "This will irreversibly delete your account. Proceed?" incorrectPassword: "Incorrect password." voteConfirm: "Confirm your vote for \"{choice}\"?" hide: "Hide" +alt: "ALT" leaveGroup: "Leave group" leaveGroupConfirm: "Are you sure you want to leave \"{name}\"?" useDrawerReactionPickerForMobile: "Display reaction picker as drawer on mobile" @@ -1051,6 +1053,7 @@ recommendedInstancesDescription: "Recommended servers separated by line breaks t caption: "Auto Caption" splash: "Splash Screen" updateAvailable: "There might be an update available!" +swipeOnMobile: "Allow swiping between pages" swipeOnDesktop: "Allow mobile-style swiping on desktop" logoImageUrl: "Logo image URL" showAdminUpdates: "Indicate a new Calckey version is avaliable (admin only)" @@ -1108,6 +1111,9 @@ isLocked: "This account has follow approvals" isModerator: "Moderator" isAdmin: "Administrator" isPatron: "Calckey Patron" +reactionPickerSkinTone: "Preferred emoji skin tone" +enableServerMachineStats: "Enable server hardware statistics" +enableIdenticonGeneration: "Enable Identicon generation" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing @@ -1209,6 +1215,7 @@ _aboutMisskey: morePatrons: "We also appreciate the support of many other helpers not listed here. Thank you! 🥰" patrons: "Calckey patrons" + patronsList: "Listed chronologically, not by donation size. Donate with the link above to get your name on here!" _nsfw: respect: "Hide NSFW media" ignore: "Don't hide NSFW media" @@ -1509,6 +1516,7 @@ _2fa: renewTOTPConfirm: "This will cause verification codes from your previous app to stop working" renewTOTPOk: "Reconfigure" renewTOTPCancel: "Cancel" + token: "2FA Token" _permissions: "read:account": "View your account information" "write:account": "Edit your account information" @@ -1546,11 +1554,12 @@ _auth: shareAccess: "Would you like to authorize \"{name}\" to access this account?" shareAccessAsk: "Are you sure you want to authorize this application to access your account?" - permissionAsk: "This application requests the following permissions" + permissionAsk: "This application requests the following permissions:" pleaseGoBack: "Please go back to the application" callback: "Returning to the application" denied: "Access denied" - copyAsk: "Please paste the following authorization code to the application" + copyAsk: "Please paste the following authorization code to the application:" + allPermissions: "Full account access" _antennaSources: all: "All posts" homeTimeline: "Posts from followed users" @@ -1625,11 +1634,11 @@ _poll: remainingSeconds: "{s} second(s) remaining" _visibility: public: "Public" - publicDescription: "Your post will be visible for all users" + publicDescription: "Your post will be visible in all public timelines" home: "Unlisted" homeDescription: "Post to home timeline only" followers: "Followers" - followersDescription: "Make visible to your followers only" + followersDescription: "Make visible to your followers and mentioned users only" specified: "Direct" specifiedDescription: "Make visible for specified users only" localOnly: "Local only" @@ -2063,14 +2072,17 @@ _deck: direct: "Direct messages" _experiments: title: "Experiments" - enablePostEditing: "Enable post editing" - postEditingCaption: "Shows the option for users to edit their existing posts via\ - \ the post options menu, and allows post edits from other instances to be recieved." enablePostImports: "Enable post imports" postImportsCaption: "Allows users to import their posts from past Calckey,\ \ Misskey, Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during\ \ load if your queue is bottlenecked." - _dialog: charactersExceeded: "Max characters exceeded! Current: {current}/Limit: {max}" charactersBelow: "Not enough characters! Current: {current}/Limit: {min}" +_skinTones: + yellow: "Yellow" + light: "Light" + mediumLight: "Medium Light" + medium: "Medium" + mediumDark: "Medium Dark" + dark: "Dark" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index a4016b7bb7..0bd874f331 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -1,8 +1,8 @@ _lang_: "Español" -headlineMisskey: "¡Un proyecto de código abierto y una plataforma de medios de comunicación\ - \ descentralizada que es gratis para siempre! \U0001F680" -introMisskey: "¡Bienvenido! ¡Calckey es un proyecto de código abierto, plataforma\ - \ descentralizado medios de comunicación social que es gratis para siempre! \U0001F680" +headlineMisskey: "¡Un proyecto de código abierto y una plataforma de medios de comunicación + descentralizada que es gratis para siempre! 🚀" +introMisskey: "¡Bienvenido! ¡Calckey es un proyecto de código abierto, plataforma + descentralizado medios de comunicación social que es gratis para siempre! 🚀" monthAndDay: "{day}/{month}" search: "Buscar" notifications: "Notificaciones" @@ -17,7 +17,7 @@ enterUsername: "Introduce el nombre de usuario" renotedBy: "Impulsado por {user}" noNotes: "No hay publicaciones" noNotifications: "No hay notificaciones" -instance: "Instancia" +instance: "Servidor" settings: "Configuración" basicSettings: "Configuración Básica" otherSettings: "Configuración avanzada" @@ -45,8 +45,8 @@ copyContent: "Copiar contenido" copyLink: "Copiar enlace" delete: "Borrar" deleteAndEdit: "Borrar y editar" -deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta publicación y editarla?\ - \ Perderás todas las reacciones, impulsos y respuestas." +deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta publicación y editarla? + Perderás todas las reacciones, impulsos y respuestas." addToList: "Agregar a lista" sendMessage: "Enviar un mensaje" copyUsername: "Copiar nombre de usuario" @@ -66,11 +66,11 @@ import: "Importar" export: "Exportar" files: "Archivos" download: "Descargar" -driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Las publicaciones que\ - \ tengan este archivo como adjunto serán eliminadas." +driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Será removido de todas + las publicaciones que tengan este archivo adjunto." unfollowConfirm: "¿Desea dejar de seguir a {name}?" -exportRequested: "Se ha solicitado la exportación. Puede tomar un tiempo. Cuando termine\ - \ la exportación, se añadirá en el drive." +exportRequested: "Se ha solicitado la exportación. Puede tomar un tiempo. Cuando termine + la exportación, se añadirá en el drive." importRequested: "Se ha solicitado la importación. Puede tomar un tiempo." lists: "Listas" noLists: "No tiene listas" @@ -85,11 +85,11 @@ error: "Error" somethingHappened: "Ocurrió un error" retry: "Reintentar" pageLoadError: "Error al cargar la página." -pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador.\ - \ Por favor limpie el caché o intente más tarde." +pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador. + Por favor limpie el caché o intente más tarde." serverIsDead: "No hay respuesta del servidor. Espere un momento y vuelva a intentarlo." -youShouldUpgradeClient: "Para ver esta página, por favor refrezca el navegador y utiliza\ - \ una versión más reciente del cliente." +youShouldUpgradeClient: "Para ver esta página, por favor refrezca el navegador y utiliza + una versión más reciente del cliente." enterListName: "Ingrese nombre de lista" privacy: "Privacidad" makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento" @@ -114,8 +114,8 @@ sensitive: "Marcado como sensible" add: "Agregar" reaction: "Reacción" reactionSetting: "Reacciones para mostrar en el menú de reacciones" -reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete\ - \ la tecla + para añadir." +reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete + la tecla + para añadir." rememberNoteVisibility: "Recordar la configuración de visibilidad de la publicación" attachCancel: "Quitar adjunto" markAsSensitive: "Marcar como sensible" @@ -144,24 +144,24 @@ emojiUrl: "URL de la imágen del emoji" addEmoji: "Agregar emoji" settingGuide: "Configuración sugerida" cacheRemoteFiles: "Mantener en cache los archivos remotos" -cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos\ - \ se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar\ - \ almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas." +cacheRemoteFilesDescription: "Si desactiva esta configuración, los archivos remotos + se cargarán desde el servidor remoto sin usar la caché. Con eso se puede ahorrar + almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas." flagAsBot: "Esta cuenta es un bot" -flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active\ - \ esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar\ - \ cadenas infinitas de reacciones, y ajustará los sistemas internos de Calckey para\ - \ que trate a esta cuenta como un bot." +flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active + esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar + cadenas infinitas de reacciones, y ajustará los sistemas internos de Calckey para + que trate a esta cuenta como un bot." flagAsCat: "Esta cuenta es un gato" flagAsCatDescription: "Vas a tener orejas de gato y hablar como un gato!" flagShowTimelineReplies: "Mostrar respuestas a las notas en la biografía" -flagShowTimelineRepliesDescription: "Cuando se marca, la línea de tiempo muestra respuestas\ - \ a otras publicaciones además de las publicaciones del usuario." -autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los\ - \ usuarios que sigues" +flagShowTimelineRepliesDescription: "Cuando se marca, la línea de tiempo muestra respuestas + a otras publicaciones además de las publicaciones del usuario." +autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los + usuarios que sigues" addAccount: "Agregar Cuenta" loginFailed: "Error al iniciar sesión" -showOnRemote: "Ver en una instancia remota" +showOnRemote: "Ver en servidor remoto" general: "General" wallpaper: "Fondo de pantalla" setWallpaper: "Establecer fondo de pantalla" @@ -170,17 +170,17 @@ searchWith: "Buscar: {q}" youHaveNoLists: "No tienes listas" followConfirm: "¿Desea seguir a {name}?" proxyAccount: "Cuenta proxy" -proxyAccountDescription: "Una cuenta proxy es una cuenta que actúa como un seguidor\ - \ remoto de un usuario bajo ciertas condiciones. Por ejemplo, cuando un usuario\ - \ añade un usuario remoto a una lista, si ningún usuario local sigue al usuario\ - \ agregado a la lista, la instancia no puede obtener su actividad. Así que la cuenta\ - \ proxy sigue al usuario añadido a la lista." +proxyAccountDescription: "Una cuenta proxy es una cuenta que actúa como un seguidor + remoto de un usuario bajo ciertas condiciones. Por ejemplo, cuando un usuario añade + un usuario remoto a una lista, si ningún usuario local sigue al usuario agregado + a la lista, el servidor no puede obtener su actividad. Así que la cuenta proxy sigue + al usuario añadido a la lista." host: "Host" selectUser: "Elegir usuario" recipient: "Recipiente" annotation: "Anotación" federation: "Federación" -instances: "Instancia" +instances: "Servidores" registeredAt: "Registrado en" latestRequestSentAt: "Ultimo pedido enviado" latestRequestReceivedAt: "Ultimo pedido recibido" @@ -190,7 +190,7 @@ charts: "Chat" perHour: "por hora" perDay: "por día" stopActivityDelivery: "Dejar de enviar actividades" -blockThisInstance: "Bloquear instancia" +blockThisInstance: "Bloquear este servidor" operations: "Operaciones" software: "Software" version: "Versión" @@ -200,18 +200,17 @@ jobQueue: "Cola de trabajos" cpuAndMemory: "CPU y Memoria" network: "Red" disk: "Disco" -instanceInfo: "información de la instancia" +instanceInfo: "Información del servidor" statistics: "Estadísticas" clearQueue: "Limpiar cola" clearQueueConfirmTitle: "¿Desea limpiar la cola?" -clearQueueConfirmText: "Las publicaciones aún no entregadas no se federarán. Normalmente\ - \ no se necesita ejecutar esta operación." +clearQueueConfirmText: "Las publicaciones aún no entregadas no se federarán. Normalmente + no se necesita ejecutar esta operación." clearCachedFiles: "Limpiar caché" clearCachedFilesConfirm: "¿Desea borrar todos los archivos remotos cacheados?" -blockedInstances: "Instancias bloqueadas" -blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear,\ - \ separadas por una linea nueva. Las instancias bloqueadas no podrán comunicarse\ - \ con esta instancia." +blockedInstances: "Servidores bloqueados" +blockedInstancesDescription: "Escriba los hosts de los servidores que desea bloquear. + Los servidores bloqueados no podrán comunicarse con este servidor." muteAndBlock: "Silenciar y bloquear" mutedUsers: "Usuarios silenciados" blockedUsers: "Usuarios bloqueados" @@ -234,9 +233,9 @@ all: "Todo" subscribing: "Suscribiendo" publishing: "Publicando" notResponding: "Sin respuestas" -instanceFollowing: "Siguiendo instancias" -instanceFollowers: "Seguidores de la instancia" -instanceUsers: "Usuarios de la instancia" +instanceFollowing: "Siguiendo en este servidor" +instanceFollowers: "Seguidores del servidor" +instanceUsers: "Usuarios de este servidor" changePassword: "Cambiar contraseña" security: "Seguridad" retypedNotMatch: "No hay coincidencia." @@ -260,9 +259,9 @@ saved: "Guardado" messaging: "Chat" upload: "Subir" keepOriginalUploading: "Mantener la imagen original" -keepOriginalUploadingDescription: "Mantener la versión original al cargar imágenes.\ - \ Si está desactivado, el navegador generará imágenes para la publicación web en\ - \ el momento de recargar la página." +keepOriginalUploadingDescription: "Mantener la versión original al cargar imágenes. + Si está desactivado, el navegador generará imágenes para la publicación web en el + momento de recargar la página." fromDrive: "Desde el drive" fromUrl: "Desde la URL" uploadFromUrl: "Subir desde una URL" @@ -311,8 +310,8 @@ unableToDelete: "No se puede borrar" inputNewFileName: "Ingrese un nuevo nombre de archivo" inputNewDescription: "Ingrese nueva descripción" inputNewFolderName: "Ingrese un nuevo nombre de la carpeta" -circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que\ - \ quieres mover." +circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que + quieres mover." hasChildFilesOrFolders: "No se puede borrar esta carpeta. No está vacía." copyUrl: "Copiar URL" rename: "Renombrar" @@ -329,8 +328,8 @@ unwatch: "Dejar de ver" accept: "Aceptar" reject: "Rechazar" normal: "Normal" -instanceName: "Nombre de la instancia" -instanceDescription: "Descripción de la instancia" +instanceName: "Nombre del servidor" +instanceDescription: "Descripción del servidor" maintainerName: "Nombre del administrador" maintainerEmail: "Correo del administrador" tosUrl: "URL de los términos de uso" @@ -346,8 +345,8 @@ connectService: "Conectar" disconnectService: "Desconectar" enableLocalTimeline: "Habilitar linea de tiempo local" enableGlobalTimeline: "Habilitar linea de tiempo global" -disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia\ - \ el administrador y los moderadores pueden seguir usándolos" +disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia + el administrador y los moderadores pueden seguir usándolos" registration: "Registro" enableRegistration: "Permitir nuevos registros" invite: "Invitar" @@ -359,11 +358,11 @@ bannerUrl: "URL de la imagen del banner" backgroundImageUrl: "URL de la imagen de fondo" basicInfo: "Información básica" pinnedUsers: "Usuarios fijados" -pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\"\ - \ separados por una linea nueva" +pinnedUsersDescription: "Describir los usuarios que quiere fijar en la pestaña \"\ + Explorar\" separados por líneas nuevas." pinnedPages: "Páginas fijadas" -pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página\ - \ principal de la instancia, separadas por lineas nuevas" +pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página + principal del servidor, separadas por líneas nuevas." pinnedClipId: "Id del clip fijado" pinnedNotes: "Publicación fijada" hcaptcha: "hCaptcha" @@ -374,17 +373,17 @@ recaptcha: "reCAPTCHA" enableRecaptcha: "activar reCAPTCHA" recaptchaSiteKey: "Clave del sitio" recaptchaSecretKey: "Clave secreta" -avoidMultiCaptchaConfirm: "El uso de múltiples Captchas puede causar interferencia.\ - \ ¿Desea desactivar el otro Captcha? Puede dejar múltiples Captchas habilitadas\ - \ presionando cancelar." +avoidMultiCaptchaConfirm: "El uso de múltiples Captchas puede causar interferencia. + ¿Desea desactivar el otro Captcha? Puede dejar múltiples Captchas habilitadas presionando + cancelar." antennas: "Antenas" manageAntennas: "Administrar antenas" name: "Nombre" antennaSource: "Origen de la antena" antennaKeywords: "Palabras clave para recibir" antennaExcludeKeywords: "Palabras clave para excluir" -antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar\ - \ con una linea nueva es una declaración OR" +antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar + con una linea nueva es una declaración OR" notifyAntenna: "Notificar nueva publicación" withFileAntenna: "Sólo publicaciones con archivos adjuntados" enableServiceworker: "Activar ServiceWorker" @@ -472,8 +471,8 @@ strongPassword: "Muy buena contraseña" passwordMatched: "Correcto" passwordNotMatched: "Las contraseñas no son las mismas" signinWith: "Inicie sesión con {x}" -signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario\ - \ y contraseña correctos." +signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario + y contraseña correctos." tapSecurityKey: "Toque la clave de seguridad" or: "O" language: "Idioma" @@ -483,8 +482,8 @@ aboutX: "Acerca de {x}" useOsNativeEmojis: "Usa los emojis nativos de la plataforma" disableDrawer: "No mostrar los menús en cajones" youHaveNoGroups: "Sin grupos" -joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su\ - \ propio grupo." +joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su + propio grupo." noHistory: "No hay datos en el historial" signinHistory: "Historial de ingresos" disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones" @@ -515,28 +514,28 @@ showFeaturedNotesInTimeline: "Mostrar publicaciones destacadas en la línea de t objectStorage: "Almacenamiento de objetos" useObjectStorage: "Usar almacenamiento de objetos" objectStorageBaseUrl: "Base URL" -objectStorageBaseUrlDesc: "Prefijo de URL utilizado para construir URL para hacer\ - \ referencia a objetos (medios). Especifique su URL si está utilizando un CDN o\ - \ Proxy; de lo contrario, especifique la dirección a la que se puede acceder públicamente\ - \ de acuerdo con la guía de servicio que va a utilizar. i.g 'https://<bucket>.s3.amazonaws.com'\ - \ para AWS S3 y 'https://storage.googleapis.com/<bucket>' para GCS." +objectStorageBaseUrlDesc: "Prefijo de URL utilizado para construir URL para hacer + referencia a objetos (medios). Especifique su URL si está utilizando un CDN o Proxy; + de lo contrario, especifique la dirección a la que se puede acceder públicamente + de acuerdo con la guía de servicio que va a utilizar. i.g 'https://<bucket>.s3.amazonaws.com' + para AWS S3 y 'https://storage.googleapis.com/<bucket>' para GCS." objectStorageBucket: "Bucket" -objectStorageBucketDesc: "Especifique el nombre del depósito utilizado en el servicio\ - \ configurado." +objectStorageBucketDesc: "Especifique el nombre del depósito utilizado en el servicio + configurado." objectStoragePrefix: "Prefix" objectStoragePrefixDesc: "Los archivos se almacenarán en el directorio de este prefijo." objectStorageEndpoint: "Endpoint" -objectStorageEndpointDesc: "Deje esto en blanco si está utilizando AWS S3; de lo contrario,\ - \ especifique el punto final como '<host>' o '<host>: <port>' de acuerdo con la\ - \ guía de servicio que va a utilizar." +objectStorageEndpointDesc: "Deje esto en blanco si está utilizando AWS S3; de lo contrario, + especifique el punto final como '<host>' o '<host>: <port>' de acuerdo con la guía + de servicio que va a utilizar." objectStorageRegion: "Region" -objectStorageRegionDesc: "Especifique una región como 'xx-east-1'. Si su servicio\ - \ no tiene distinción sobre regiones, déjelo en blanco o complete con 'us-east-1'." +objectStorageRegionDesc: "Especifique una región como 'xx-east-1'. Si su servicio + no tiene distinción sobre regiones, déjelo en blanco o complete con 'us-east-1'." objectStorageUseSSL: "Usar SSL" objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión API" objectStorageUseProxy: "Conectarse a través de Proxy" -objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\ - \ de Almacenamiento de objetos" +objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión + de Almacenamiento de objetos" objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir " serverLogs: "Registros del servidor" deleteAll: "Eliminar todos" @@ -564,8 +563,8 @@ sort: "Ordenar" ascendingOrder: "Ascendente" descendingOrder: "Descendente" scratchpad: "Scratch pad" -scratchpadDescription: "Scratchpad proporciona un entorno experimental para AiScript.\ - \ Puede escribir, ejecutar y verificar los resultados que interactúan con Calckey." +scratchpadDescription: "Scratchpad proporciona un entorno experimental para AiScript. + Puede escribir, ejecutar y verificar los resultados que interactúan con Calckey." output: "Salida" script: "Script" disablePagesScript: "Deshabilitar AiScript en Páginas" @@ -573,14 +572,14 @@ updateRemoteUser: "Actualizar información de usuario remoto" deleteAllFiles: "Borrar todos los archivos" deleteAllFilesConfirm: "¿Desea borrar todos los archivos?" removeAllFollowing: "Retener todos los siguientes" -removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}.\ - \ Ejecutar en caso de que esta instancia haya dejado de existir." +removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}. + Ejecutar en caso de que esta instancia haya dejado de existir." userSuspended: "Este usuario ha sido suspendido." userSilenced: "Este usuario ha sido silenciado." yourAccountSuspendedTitle: "Esta cuenta ha sido suspendida" -yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violaciones\ - \ de los términos de servicio del servidor y otras razones. Para más información,\ - \ póngase en contacto con el administrador. Por favor, no cree una nueva cuenta." +yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violaciones + de los términos de servicio del servidor y otras razones. Para más información, + póngase en contacto con el administrador. Por favor, no cree una nueva cuenta." menu: "Menú" divider: "Divisor" addItem: "Agregar elemento" @@ -634,15 +633,15 @@ smtpHost: "Host" smtpPort: "Puerto" smtpUser: "Nombre de usuario" smtpPass: "Contraseña" -emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para\ - \ deshabilitar la autenticación SMTP" +emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para + deshabilitar la autenticación SMTP" smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP" smtpSecureInfo: "Apagar cuando se use STARTTLS" testEmail: "Prueba de envío" wordMute: "Silenciar palabras" regexpError: "Error de la expresión regular" -regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line}\ - \ de las palabras muteadas {tab}" +regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line} + de las palabras muteadas {tab}" instanceMute: "Instancias silenciadas" userSaysSomething: "{name} dijo algo" makeActive: "Activar" @@ -658,13 +657,13 @@ create: "Crear" notificationSetting: "Ajustes de Notificaciones" notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar" useGlobalSetting: "Usar ajustes globales" -useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de\ - \ la cuenta, al desactivarse se pueden hacer configuraciones particulares." +useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de + la cuenta, al desactivarse se pueden hacer configuraciones particulares." other: "Otro" regenerateLoginToken: "Regenerar token de login" -regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el\ - \ login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en\ - \ todos los dispositivos." +regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el + login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en todos + los dispositivos." setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios." fileIdOrUrl: "Id del archivo o URL" behavior: "Comportamiento" @@ -672,15 +671,15 @@ sample: "Muestra" abuseReports: "Reportes" reportAbuse: "Reportar" reportAbuseOf: "Reportar a {name}" -fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en\ - \ particular, ingrese la URL de esta." +fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en + particular, ingrese la URL de esta." abuseReported: "Se ha enviado el reporte. Muchas gracias." reporter: "Reportador" reporteeOrigin: "Reportar a" reporterOrigin: "Origen del reporte" forwardReport: "Transferir un informe a una instancia remota" -forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá\ - \ como una cuenta anónima del sistema" +forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá + como una cuenta anónima del sistema" send: "Enviar" abuseMarkAsResolved: "Marcar reporte como resuelto" openInNewTab: "Abrir en una Nueva Pestaña" @@ -701,8 +700,8 @@ unclip: "Quitar clip" confirmToUnclipAlreadyClippedNote: "Esta nota ya está incluida en el clip \"{name}\"\ . ¿Quiere quitar la nota del clip?" public: "Público" -i18nInfo: "Calckey está siendo traducido a varios idiomas gracias a voluntarios. Se\ - \ puede colaborar traduciendo en {link}" +i18nInfo: "Calckey está siendo traducido a varios idiomas gracias a voluntarios. Se + puede colaborar traduciendo en {link}" manageAccessTokens: "Administrar tokens de acceso" accountInfo: "Información de la Cuenta" notesCount: "Cantidad de notas" @@ -721,18 +720,18 @@ no: "No" driveFilesCount: "Cantidad de archivos en el drive" driveUsage: "Uso del drive" noCrawle: "Rechazar indexación del crawler" -noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas,\ - \ páginas, etc." -lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"Sólo\ - \ seguidores\", tus notas serán visibles para cualquiera, incluso si requieres que\ - \ los seguidores sean aprobados manualmente." -alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por\ - \ defecto" +noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas, + páginas, etc." +lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"Sólo + seguidores\", tus notas serán visibles para cualquiera, incluso si requieres que + los seguidores sean aprobados manualmente." +alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por + defecto" loadRawImages: "Cargar las imágenes originales en lugar de mostrar las miniaturas" disableShowingAnimatedImages: "No reproducir imágenes animadas" -verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por\ - \ favor, acceda al enlace proporcionado en el correo electrónico para completar\ - \ la configuración." +verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por + favor, acceda al enlace proporcionado en el correo electrónico para completar la + configuración." notSet: "Sin especificar" emailVerified: "Su dirección de correo electrónico ha sido verificada." noteFavoritesCount: "Número de notas favoritas" @@ -744,16 +743,16 @@ clips: "Clip" experimentalFeatures: "Características experimentales" developer: "Desarrolladores" makeExplorable: "Hacer visible la cuenta en \"Explorar\"" -makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la\ - \ sección \"Explorar\"." +makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la + sección \"Explorar\"." showGapBetweenNotesInTimeline: "Mostrar un intervalo entre notas en la línea de tiempo" duplicate: "Duplicar" left: "Izquierda" center: "Centrar" wide: "Ancho" narrow: "Estrecho" -reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la\ - \ página. ¿Recargar ahora?" +reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la + página. ¿Recargar ahora?" needReloadToApply: "Se requiere un reinicio para la aplicar los cambios" showTitlebar: "Mostrar la barra de título" clearCache: "Limpiar caché" @@ -761,11 +760,11 @@ onlineUsersCount: "{n} usuarios en línea" nUsers: "{n} Usuarios" nNotes: "{n} Notas" sendErrorReports: "Envíar informe de errores" -sendErrorReportsDescription: "Si habilita esta opción, los detalles de los errores\ - \ serán compartidos con Calckey cuando ocurra un problema, lo que ayudará a mejorar\ - \ la calidad de Calckey. \nEsto incluye información como la versión del sistema\ - \ operativo, el tipo de navegador que está utilizando y su historial en Calckey,\ - \ entre otros datos." +sendErrorReportsDescription: "Si habilita esta opción, los detalles de los errores + serán compartidos con Calckey cuando ocurra un problema, lo que ayudará a mejorar + la calidad de Calckey. \nEsto incluye información como la versión del sistema operativo, + el tipo de navegador que está utilizando y su historial en Calckey, entre otros + datos." myTheme: "Mi Tema" backgroundColor: "Fondo" accentColor: "Acento" @@ -793,8 +792,8 @@ receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia" emailNotification: "Notificaciones por correo electrónico" publish: "Publicar" inChannelSearch: "Buscar en el canal" -useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\ - \ de reacciones" +useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu + de reacciones" typingUsers: "{users} está escribiendo" jumpToSpecifiedDate: "Saltar a una fecha específica" showingPastTimeline: "Mostrar líneas de tiempo antiguas" @@ -805,16 +804,16 @@ unlikeConfirm: "¿Quitar como favorito?" fullView: "Vista completa" quitFullView: "quitar vista completa" addDescription: "Agregar descripción" -userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando Pin en el menú\ - \ de notas individuales" +userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando Pin en el menú + de notas individuales" notSpecifiedMentionWarning: "Algunas menciones no están incluidas en el destino" info: "Información" userInfo: "Información del usuario" unknown: "Desconocido" onlineStatus: "En línea" hideOnlineStatus: "mostrarse como desconectado" -hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia\ - \ de algunas funciones, como la búsqueda" +hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia + de algunas funciones, como la búsqueda" online: "En línea" active: "Activo" offline: "Sin conexión" @@ -849,8 +848,8 @@ emailNotConfiguredWarning: "No se ha configurado una dirección de correo electr ratio: "Proporción" previewNoteText: "Mostrar vista preliminar" customCss: "CSS personalizado" -customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir\ - \ valores inadecuados puede hacer que el cliente deje de funcionar con normalidad." +customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir + valores inadecuados puede hacer que el cliente deje de funcionar con normalidad." global: "Global" squareAvatars: "Mostrar iconos cuadrados" sent: "Enviar" @@ -865,9 +864,9 @@ whatIsNew: "Mostrar cambios" translate: "Traducir" translatedFrom: "Traducido de {x}" accountDeletionInProgress: "La eliminación de la cuenta está en curso" -usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede\ - \ utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres\ - \ de usuario no se pueden cambiar posteriormente." +usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede + utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres + de usuario no se pueden cambiar posteriormente." aiChanMode: "Modo Ai" keepCw: "Mantener la advertencia de contenido" pubSub: "Cuentas Pub/Sub" @@ -877,21 +876,21 @@ unresolved: "Sin resolver" breakFollow: "Dejar de seguir" itsOn: "¡Está encendido!" itsOff: "¡Está apagado!" -emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro\ - \ de la cuenta" +emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro + de la cuenta" unread: "No leído" filter: "Filtro" controlPanel: "Panel de control" manageAccounts: "Administrar cuenta" makeReactionsPublic: "Hacer el historial de reacciones público" -makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán públicamente\ - \ visibles." +makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán públicamente + visibles." classic: "Clásico" muteThread: "Ocultar hilo" unmuteThread: "Mostrar hilo" ffVisibility: "Visibilidad de seguidores y seguidos" -ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes\ - \ te siguen" +ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes + te siguen" continueThread: "Ver la continuación del hilo" deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?" incorrectPassword: "La contraseña es incorrecta" @@ -932,16 +931,16 @@ thereIsUnresolvedAbuseReportWarning: "Hay reportes sin resolver" recommended: "Recomendado" check: "Verificar" driveCapOverrideLabel: "Cambiar la capacidad de la unidad para este usuario" -driveCapOverrideCaption: "Restablecer la capacidad a su predeterminado ingresando\ - \ un valor de 0 o menos" +driveCapOverrideCaption: "Restablecer la capacidad a su predeterminado ingresando + un valor de 0 o menos" requireAdminForView: "Necesitas iniciar sesión como administrador para ver esto." isSystemAccount: "Cuenta creada y operada automáticamente por el sistema" typeToConfirm: "Ingrese {x} para confirmar" deleteAccount: "Borrar cuenta" document: "Documento" numberOfPageCache: "Cantidad de páginas cacheadas" -numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien\ - \ puede aumentar la carga y la memoria a usarse" +numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien + puede aumentar la carga y la memoria a usarse" logoutConfirm: "¿Cerrar sesión?" lastActiveDate: "Utilizado por última vez el" statusbar: "Barra de estado" @@ -958,37 +957,36 @@ sensitiveMediaDetection: "Detección de contenido NSFW" localOnly: "Solo local" remoteOnly: "Sólo remoto" failedToUpload: "La subida falló" -cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas\ - \ partes han sido detectadas comoNSFW." -cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en\ - \ la unidad del usuario." +cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas + partes han sido detectadas comoNSFW." +cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en + la unidad del usuario." beta: "Beta" enableAutoSensitive: "Marcar automáticamente contenido NSFW" -enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido\ - \ NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está\ - \ desactivada, puede ser activado para toda la instancia." -activeEmailValidationDescription: "Habilita la validación estricta de direcciones\ - \ de correo electrónico, lo cual incluye la revisión de direcciones desechables\ - \ y si se puede comunicar con éstas. Cuando está deshabilitado, sólo el formato\ - \ de la dirección es validado." +enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido + NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está desactivada, + puede ser activado para toda la instancia." +activeEmailValidationDescription: "Habilita la validación estricta de direcciones + de correo electrónico, lo cual incluye la revisión de direcciones desechables y + si se puede comunicar con éstas. Cuando está deshabilitado, sólo el formato de la + dirección es validado." navbar: "Barra de navegación" shuffle: "Aleatorio" account: "Cuentas" move: "Mover" _sensitiveMediaDetection: - description: "Reduce el esfuerzo de la moderación el el servidor a través del reconocimiento\ - \ automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar\ - \ ligeramente la carga en el servidor." + description: "Reduce el esfuerzo de la moderación el el servidor a través del reconocimiento + automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar + ligeramente la carga en el servidor." sensitivity: "Sensibilidad de detección" - sensitivityDescription: "Reducir la sensibilidad puede acarrear a varios falsos\ - \ positivos, mientras que incrementarla puede reducir las detecciones (falsos\ - \ negativos)." + sensitivityDescription: "Reducir la sensibilidad puede acarrear a varios falsos + positivos, mientras que incrementarla puede reducir las detecciones (falsos negativos)." setSensitiveFlagAutomatically: "Marcar como NSFW" - setSensitiveFlagAutomaticallyDescription: "Los resultados de la detección interna\ - \ pueden ser retenidos incluso si la opción está desactivada." + setSensitiveFlagAutomaticallyDescription: "Los resultados de la detección interna + pueden ser retenidos incluso si la opción está desactivada." analyzeVideos: "Habilitar el análisis de videos" - analyzeVideosDescription: "Analizar videos en adición a las imágenes. Esto puede\ - \ incrementar ligeramente la carga del servidor." + analyzeVideosDescription: "Analizar videos en adición a las imágenes. Esto puede + incrementar ligeramente la carga del servidor." _emailUnavailable: used: "Ya fue usado" format: "El formato de este correo electrónico no es válido" @@ -1002,15 +1000,15 @@ _ffVisibility: _signup: almostThere: "Ya falta poco" emailAddressInfo: "Ingrese el correo electrónico que usa. Este no se hará público." - emailSent: "Se envió un correo de verificación a la dirección {email}. Acceda al\ - \ link enviado en el correo para completar el ingreso." + emailSent: "Se envió un correo de verificación a la dirección {email}. Acceda al + link enviado en el correo para completar el ingreso." _accountDelete: accountDelete: "Eliminar Cuenta" - mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede\ - \ pasar un tiempo hasta que se complete si es mucho el contenido creado y los\ - \ archivos subidos." - sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección\ - \ usada para el registro." + mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede + pasar un tiempo hasta que se complete si es mucho el contenido creado y los archivos + subidos." + sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección + usada para el registro." requestAccountDelete: "Pedir la eliminación de la cuenta." started: "El proceso de eliminación ha comenzado." inProgress: "La eliminación está en proceso." @@ -1018,12 +1016,11 @@ _ad: back: "Deseleccionar" reduceFrequencyOfThisAd: "Mostrar menos este anuncio." _forgotPassword: - enterEmail: "Ingrese el correo usado para registrar la cuenta. Se enviará un link\ - \ para resetear la contraseña." + enterEmail: "Ingrese el correo usado para registrar la cuenta. Se enviará un link + para resetear la contraseña." ifNoEmail: "Si no utilizó un correo para crear la cuenta, contáctese con el administrador." - contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,\ - \ póngase en contacto con el administrador de la instancia para restablecer su\ - \ contraseña" + contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico, + póngase en contacto con el administrador de la instancia para restablecer su contraseña" _gallery: my: "Mi galería" liked: "Publicaciones que me gustan" @@ -1046,15 +1043,15 @@ _preferencesBackups: save: "Guardar cambios" inputName: "Por favor, ingresa un nombre para este respaldo" cannotSave: "Fallo al guardar" - nameAlreadyExists: "Un respaldo llamado \"{name}\" ya existe. Por favor ingresa\ - \ un nombre diferente" + nameAlreadyExists: "Un respaldo llamado \"{name}\" ya existe. Por favor ingresa + un nombre diferente" applyConfirm: "¿Realmente quieres aplicar los cambios desde el archivo \"{name}\"\ \ a este dispositivo? Las configuraciones existentes serán sobreescritas. " saveConfirm: "¿Guardar respaldo como \"{name}\"?" deleteConfirm: "¿Borrar el respaldo \"{name}\"?" renameConfirm: "¿Renombrar este respaldo de \"{old}\" a \"{new}\"?" - noBackups: "No existen respaldos. Deberás respaldar las configuraciones del cliente\ - \ en este servidor usando \"Crear nuevo respaldo\"" + noBackups: "No existen respaldos. Deberás respaldar las configuraciones del cliente + en este servidor usando \"Crear nuevo respaldo\"" createdAt: "Creado: {date} {time}" updatedAt: "Actualizado: {date} {time}" cannotLoad: "La carga falló" @@ -1066,15 +1063,15 @@ _registry: domain: "Dominio" createKey: "Crear una llave" _aboutMisskey: - about: "Calckey es una bifurcación de Misskey creada por ThatOneCalculator, que\ - \ ha estado en desarrollo desde el 2022." + about: "Calckey es una bifurcación de Misskey creada por ThatOneCalculator, que + ha estado en desarrollo desde el 2022." contributors: "Principales colaboradores" allContributors: "Todos los colaboradores" source: "Código fuente" translation: "Traducir Calckey" donate: "Donar a Calckey" - morePatrons: "También apreciamos el apoyo de muchos más que no están enlistados\ - \ aquí. ¡Gracias! \U0001F970" + morePatrons: "También apreciamos el apoyo de muchos más que no están enlistados + aquí. ¡Gracias! 🥰" patrons: "Mecenas de Calckey" _nsfw: respect: "Ocultar medios NSFW" @@ -1082,13 +1079,13 @@ _nsfw: force: "Ocultar todos los medios" _mfm: cheatSheet: "Hoja de referencia de MFM" - intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares\ - \ dentro de Misskey, Calckey, Akkoma, y mucho más. Aquí puede ver una lista de\ - \ sintaxis disponibles en MFM." + intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares + dentro de Misskey, Calckey, Akkoma, y mucho más. Aquí puede ver una lista de sintaxis + disponibles en MFM." dummy: "Calckey expande el mundo de la Fediverso" mention: "Menciones" - mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar\ - \ para notificar a un usuario en particular." + mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar + para notificar a un usuario en particular." hashtag: "Hashtag" hashtagDescription: "Puede especificar un hashtag con un numeral y el texto." url: "URL" @@ -1104,8 +1101,8 @@ _mfm: inlineCode: "Código (insertado)" inlineCodeDescription: "Muestra el código de un programa resaltando su sintaxis" blockCode: "Código (bloque)" - blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias\ - \ líneas con bloques." + blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias + líneas con bloques." inlineMath: "Fórmula (insertado)" inlineMathDescription: "Muestra fórmulas (KaTeX) insertadas" blockMath: "Fórmula (bloque)" @@ -1117,8 +1114,8 @@ _mfm: search: "Buscar" searchDescription: "Muestra una caja de búsqueda con texto pre-escrito" flip: "Echar de un capirotazo" - flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda\ - \ / derecha." + flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda + / derecha." jelly: "Animación (gelatina)" jellyDescription: "Aplica un efecto de animación tipo gelatina" tada: "Animación (tadá)" @@ -1140,8 +1137,8 @@ _mfm: x4: "Totalmente grande" x4Description: "Muestra el contenido totalmente grande" blur: "Desenfoque" - blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar\ - \ el puntero encima." + blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar + el puntero encima." font: "Fuente" fontDescription: "Elegir la fuente del contenido" rainbow: "Arcoíris" @@ -1151,8 +1148,8 @@ _mfm: rotate: "Rotar" rotateDescription: "Rota el contenido a un ángulo especificado." plain: "Plano" - plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto\ - \ MFM." + plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto + MFM." position: Posición _instanceTicker: none: "No mostrar" @@ -1182,20 +1179,19 @@ _menuDisplay: hide: "Ocultar" _wordMute: muteWords: "Palabras que silenciar" - muteWordsDescription: "Separar con espacios indica una declaracion And, separar\ - \ con lineas nuevas indica una declaracion Or。" - muteWordsDescription2: "Encerrar las palabras clave entre numerales para usar expresiones\ - \ regulares" + muteWordsDescription: "Separar con espacios indica una declaracion And, separar + con lineas nuevas indica una declaracion Or。" + muteWordsDescription2: "Encerrar las palabras clave entre numerales para usar expresiones + regulares" softDescription: "Ocultar en la linea de tiempo las notas que cumplen las condiciones" - hardDescription: "Evitar que se agreguen a la linea de tiempo las notas que cumplen\ - \ las condiciones. Las notas no agregadas seguirán quitadas aunque cambien las\ - \ condiciones." + hardDescription: "Evitar que se agreguen a la linea de tiempo las notas que cumplen + las condiciones. Las notas no agregadas seguirán quitadas aunque cambien las condiciones." soft: "Suave" hard: "Duro" mutedNotes: "Notas silenciadas" _instanceMute: - instanceMuteDescription: "Silencia todas las notas y reposts de la instancias seleccionadas,\ - \ incluyendo respuestas a los usuarios de las mismas" + instanceMuteDescription: "Silencia todas las notas y reposts de la instancias seleccionadas, + incluyendo respuestas a los usuarios de las mismas" instanceMuteDescription2: "Separar por líneas" title: "Oculta las notas de las instancias listadas." heading: "Instancias a silenciar" @@ -1301,47 +1297,47 @@ _tutorial: step1_1: "¡Bienvenido!" step1_2: "Vamos a configurarte. Estarás listo y funcionando en poco tiempo" step2_1: "En primer lugar, rellena tu perfil" - step2_2: "Proporcionar algo de información sobre quién eres hará que sea más fácil\ - \ para los demás saber si quieren ver tus notas o seguirte." + step2_2: "Proporcionar algo de información sobre quién eres hará que sea más fácil + para los demás saber si quieren ver tus notas o seguirte." step3_1: "¡Ahora es el momento de seguir a algunas personas!" - step3_2: "Tu página de inicio y tus líneas de tiempo sociales se basan en quién\ - \ sigues, así que intenta seguir un par de cuentas para empezar.\nHaz clic en\ - \ el círculo más en la parte superior derecha de un perfil para seguirlos." + step3_2: "Tu página de inicio y tus líneas de tiempo sociales se basan en quién + sigues, así que intenta seguir un par de cuentas para empezar.\nHaz clic en el + círculo más en la parte superior derecha de un perfil para seguirlos." step4_1: "Vamos a salir a la calle" - step4_2: "Para tu primer post, a algunas personas les gusta hacer un post de {introduction}\ - \ o un simple \"¡Hola mundo!\"" + step4_2: "Para tu primer post, a algunas personas les gusta hacer un post de {introduction} + o un simple \"¡Hola mundo!\"" step5_1: "¡Líneas de tiempo, líneas de tiempo por todas partes!" step5_2: "Su instancia tiene {timelines} diferentes líneas de tiempo habilitadas" - step5_3: "La línea de tiempo Inicio {icon} es donde puedes ver las publicaciones\ - \ de tus seguidores." - step5_4: "La línea de tiempo Local {icon} es donde puedes ver las publicaciones\ - \ de todos los demás en esta instancia." - step5_5: "La línea de tiempo {icon} recomendada es donde puedes ver las publicaciones\ - \ de las instancias que los administradores recomiendan." - step5_6: "La línea de tiempo Social {icon} es donde puedes ver las publicaciones\ - \ de los amigos de tus seguidores." - step5_7: "La línea de tiempo Global {icon} es donde puedes ver las publicaciones\ - \ de todas las demás instancias conectadas." + step5_3: "La línea de tiempo Inicio {icon} es donde puedes ver las publicaciones + de tus seguidores." + step5_4: "La línea de tiempo Local {icon} es donde puedes ver las publicaciones + de todos los demás en esta instancia." + step5_5: "La línea de tiempo {icon} recomendada es donde puedes ver las publicaciones + de las instancias que los administradores recomiendan." + step5_6: "La línea de tiempo Social {icon} es donde puedes ver las publicaciones + de los amigos de tus seguidores." + step5_7: "La línea de tiempo Global {icon} es donde puedes ver las publicaciones + de todas las demás instancias conectadas." step6_1: "Entonces, ¿qué es este lugar?" - step6_2: "Bueno, no sólo te has unido a Calckey. Te has unido a un portal del Fediverso,\ - \ una red interconectada de miles de servidores, llamada \"instancias\"" - step6_3: "Cada servidor funciona de forma diferente, y no todos los servidores ejecutan\ - \ Calckey. Sin embargo, ¡éste lo hace! Es un poco complicado, pero le cogerás\ - \ el tranquillo enseguida" + step6_2: "Bueno, no sólo te has unido a Calckey. Te has unido a un portal del Fediverso, + una red interconectada de miles de servidores, llamada \"instancias\"" + step6_3: "Cada servidor funciona de forma diferente, y no todos los servidores ejecutan + Calckey. Sin embargo, ¡éste lo hace! Es un poco complicado, pero le cogerás el + tranquillo enseguida" step6_4: "¡Ahora ve, explora y diviértete!" _2fa: alreadyRegistered: "Ya has completado la configuración." registerTOTP: "Registrar dispositivo" registerSecurityKey: "Registrar clave" - step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o\ - \ {b} u otra." + step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o + {b} u otra." step2: "Luego, escanee con la aplicación el código QR mostrado en pantalla." step2Url: "En una aplicación de escritorio se puede ingresar la siguiente URL:" step3: "Para terminar, ingrese el token mostrado en la aplicación." step4: "Ahora cuando inicie sesión, ingrese el mismo token" - securityKeyInfo: "Se puede configurar el inicio de sesión usando una clave de seguridad\ - \ de hardware que soporte FIDO2 o con un certificado de huella digital o con un\ - \ PIN" + securityKeyInfo: "Se puede configurar el inicio de sesión usando una clave de seguridad + de hardware que soporte FIDO2 o con un certificado de huella digital o con un + PIN" _permissions: "read:account": "Ver información de la cuenta" "write:account": "Editar información de la cuenta" @@ -1377,8 +1373,8 @@ _permissions: "write:gallery-likes": "Editar favoritos de la galería" _auth: shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?" - shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder\ - \ a su cuenta?" + shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder + a su cuenta?" permissionAsk: "Esta aplicación requiere los siguientes permisos" pleaseGoBack: "Por favor, vuelve a la aplicación" callback: "Volviendo a la aplicación" @@ -1772,8 +1768,8 @@ _pages: _seedRandomPick: arg1: "Semilla" arg2: "Listas" - DRPWPM: "Elegir aleatoriamente de la lista ponderada (Diariamente para cada\ - \ usuario)" + DRPWPM: "Elegir aleatoriamente de la lista ponderada (Diariamente para cada + usuario)" _DRPWPM: arg1: "Lista de texto" pick: "Elegir de la lista" @@ -1804,8 +1800,8 @@ _pages: _for: arg1: "Cantidad de repeticiones" arg2: "Acción" - typeError: "El slot {slot} acepta el tipo {expect} pero fue ingresado el tipo\ - \ {actual}" + typeError: "El slot {slot} acepta el tipo {expect} pero fue ingresado el tipo + {actual}" thereIsEmptySlot: "El slot {slot} está vacío" types: string: "Texto" @@ -1869,10 +1865,10 @@ _deck: newProfile: "Nuevo perfil" deleteProfile: "Eliminar perfil" introduction: "¡Crea la interfaz perfecta para tí organizando las columnas libremente!" - introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas\ - \ columnas donde quieras." - widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna\ - \ y agrega un widget." + introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas + columnas donde quieras." + widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna + y agrega un widget." _columns: main: "Principal" widgets: "Widgets" @@ -1885,11 +1881,11 @@ _deck: manageGroups: Administrar grupos replayTutorial: Repetir Tutorial privateMode: Modo privado -addInstance: Añadir una instancia +addInstance: Añadir un servidor renoteMute: Silenciar impulsos renoteUnmute: Dejar de silenciar impulsos flagSpeakAsCat: Habla como un gato -selectInstance: Selectiona una instancia +selectInstance: Selecciona un servidor flagSpeakAsCatDescription: Tu publicación se "nyanified" cuando esté en modo gato allowedInstances: Instancias en la lista blanca breakFollowConfirm: ¿Estás seguro de que quieres eliminar el seguidor? @@ -1905,7 +1901,7 @@ license: Licencia noThankYou: No gracias userSaysSomethingReason: '{name} dijo {reason}' hiddenTags: Etiquetas Ocultas -noInstances: No hay instancias +noInstances: No hay servidores accountMoved: 'Usuario ha movido a una cuenta nueva:' caption: Auto Subtítulos showAds: Mostrar Anuncios @@ -1922,8 +1918,26 @@ apps: Aplicaciones migration: Migración silenced: Silenciado deleted: Eliminado -edited: Editado +edited: 'Editado a las {date} {time}' editNote: Editar nota -silenceThisInstance: Silenciar esta instancia +silenceThisInstance: Silenciar este servidor findOtherInstance: Buscar otro servidor userSaysSomethingReasonRenote: '{name} impulsó una publicación que contiene {reason]' +enableRecommendedTimeline: Habilitar línea de tiempo "Recomendado" +searchPlaceholder: Buscar en Calckey +listsDesc: Las listas te permiten crear líneas de tiempo con usuarios específicos. + Puedes acceder a ellas desde la pestaña "Línea de tiempo". +removeReaction: Quitar tu reacción +selectChannel: Seleccionar canal +showEmojisInReactionNotifications: Mostrar emojis en notificaciones de reacciones +silencedInstancesDescription: Escriba los hosts de los servidores que desea bloquear. + Las cuentas en estos servidores serán tratadas como "silenciadas", solo podrán hacer + solicitudes de seguimiento, y no podrán mencionar a usuarios de este servidor si + no les siguen. Esto no afecta los servidores bloqueados. +silencedInstances: Servidores silenciados +hiddenTagsDescription: 'Escriba los hashtags (sin el #) que desea ocultar de las secciones + de Tendencias y Explorar. Los hashtags ocultos seguirán siendo descubribles por + otros métodos.' +jumpToPrevious: Ver anterior +enableEmojiReactions: Habilitar reacciones de emoji +cw: Aviso de contenido diff --git a/locales/fi.yml b/locales/fi.yml index aa9699cca8..9646231f47 100644 --- a/locales/fi.yml +++ b/locales/fi.yml @@ -831,7 +831,7 @@ makeReactionsPublic: Aseta reaktiohistoria julkiseksi unread: Lukematon deleted: Poistettu editNote: Muokkaa viestiä -edited: Muokattu +edited: 'Muokattu klo {date} {time}' avoidMultiCaptchaConfirm: Useiden Captcha-järjestelmien käyttö voi aiheuttaa häiriöitä niiden välillä. Haluatko poistaa käytöstä muut tällä hetkellä käytössä olevat Captcha-järjestelmät? Jos haluat, että ne pysyvät käytössä, paina peruutusnäppäintä. diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 2e6b1400f9..5291d16932 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -2022,13 +2022,13 @@ silencedInstances: Instances silencieuses silenced: Silencieux deleted: Effacé editNote: Modifier note -edited: Modifié +edited: 'Modifié à {date} {time}' flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des personnes aux publications des autres. _experiments: alpha: Alpha beta: Beta - enablePostEditing: Autoriser l'édition de note + enablePostImports: Autoriser l'importation de messages title: Expérimentations findOtherInstance: Trouver un autre serveur userSaysSomethingReasonQuote: '{name} a cité une note contenant {reason}' diff --git a/locales/index.js b/locales/index.js index 7399bb5a18..62e55e7e5c 100644 --- a/locales/index.js +++ b/locales/index.js @@ -2,59 +2,90 @@ * Languages Loader */ -const fs = require('fs'); -const yaml = require('js-yaml'); -let languages = [] -let languages_custom = [] - -const merge = (...args) => args.reduce((a, c) => ({ - ...a, - ...c, - ...Object.entries(a) - .filter(([k]) => c && typeof c[k] === 'object') - .reduce((a, [k, v]) => (a[k] = merge(v, c[k]), a), {}) -}), {}); +const fs = require("fs"); +const yaml = require("js-yaml"); +const languages = []; +const languages_custom = []; +const merge = (...args) => + args.reduce( + (a, c) => ({ + ...a, + ...c, + ...Object.entries(a) + .filter(([k]) => c && typeof c[k] === "object") + .reduce((a, [k, v]) => ((a[k] = merge(v, c[k])), a), {}), + }), + {}, + ); fs.readdirSync(__dirname).forEach((file) => { - if (file.includes('.yml')){ - file = file.slice(0, file.indexOf('.')) + if (file.includes(".yml")) { + file = file.slice(0, file.indexOf(".")); languages.push(file); } -}) +}); -fs.readdirSync(__dirname + '/../custom/locales').forEach((file) => { - if (file.includes('.yml')){ - file = file.slice(0, file.indexOf('.')) +fs.readdirSync(__dirname + "/../custom/locales").forEach((file) => { + if (file.includes(".yml")) { + file = file.slice(0, file.indexOf(".")); languages_custom.push(file); } -}) +}); const primaries = { - 'en': 'US', - 'ja': 'JP', - 'zh': 'CN', + en: "US", + ja: "JP", + zh: "CN", }; // 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く -const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), ''); +const clean = (text) => + text.replace(new RegExp(String.fromCodePoint(0x08), "g"), ""); -const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, 'utf-8'))) || {}, a), {}); -const locales_custom = languages_custom.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(`${__dirname}/../custom/locales/${c}.yml`, 'utf-8'))) || {}, a), {}); -Object.assign(locales, locales_custom) +const locales = languages.reduce( + (a, c) => ( + (a[c] = + yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, "utf-8"))) || + {}), + a + ), + {}, +); +const locales_custom = languages_custom.reduce( + (a, c) => ( + (a[c] = + yaml.load( + clean( + fs.readFileSync(`${__dirname}/../custom/locales/${c}.yml`, "utf-8"), + ), + ) || {}), + a + ), + {}, +); +Object.assign(locales, locales_custom); -module.exports = Object.entries(locales) - .reduce((a, [k ,v]) => (a[k] = (() => { - const [lang] = k.split('-'); - switch (k) { - case 'ja-JP': return v; - case 'ja-KS': - case 'en-US': return merge(locales['ja-JP'], v); - default: return merge( - locales['ja-JP'], - locales['en-US'], - locales[`${lang}-${primaries[lang]}`] || {}, - v - ); - } - })(), a), {}); +module.exports = Object.entries(locales).reduce( + (a, [k, v]) => ( + (a[k] = (() => { + const [lang] = k.split("-"); + switch (k) { + case "ja-JP": + return v; + case "ja-KS": + case "en-US": + return merge(locales["ja-JP"], v); + default: + return merge( + locales["ja-JP"], + locales["en-US"], + locales[`${lang}-${primaries[lang]}`] || {}, + v, + ); + } + })()), + a + ), + {}, +); diff --git a/locales/it-IT.yml b/locales/it-IT.yml index 7e39e7746c..bdf7cab541 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -33,9 +33,9 @@ logout: "Esci" signup: "Iscriviti" uploading: "Caricamento..." save: "Salva" -users: "Utente" +users: "Utenti" addUser: "Aggiungi utente" -favorite: "Preferiti" +favorite: "Aggiungi ai preferiti" favorites: "Preferiti" unfavorite: "Rimuovi nota dai preferiti" favorited: "Aggiunta ai tuoi preferiti." @@ -58,7 +58,7 @@ loadMore: "Mostra di più" showMore: "Mostra di più" showLess: "Chiudi" youGotNewFollower: "Ha iniziato a seguirti" -receiveFollowRequest: "Hai ricevuto una richiesta di follow." +receiveFollowRequest: "Hai ricevuto una richiesta di follow" followRequestAccepted: "Richiesta di follow accettata" mention: "Menzioni" mentions: "Menzioni" @@ -1559,3 +1559,5 @@ _deck: mentions: "Menzioni" direct: "Diretta" noThankYou: No grazie +addInstance: Aggiungi un'istanza +deleted: Eliminato diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index afd290b8cf..9f2f825e55 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -978,6 +978,8 @@ enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" preventAiLearning: "AIによる学習を防止" preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。" noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。" +enableServerMachineStats: "サーバーのマシン情報を公開する" +enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" _sensitiveMediaDetection: description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" @@ -1336,6 +1338,7 @@ _2fa: renewTOTPConfirm: "今までの認証アプリの確認コードは使用できなくなります" renewTOTPOk: "再設定する" renewTOTPCancel: "やめておく" + token: "多要素認証トークン" _permissions: "read:account": "アカウントの情報を見る" "write:account": "アカウントの情報を変更する" @@ -1886,16 +1889,14 @@ hiddenTagsDescription: 'トレンドと「みつける」から除外したい hiddenTags: 非表示にするハッシュタグ apps: "アプリ" _experiments: - enablePostEditing: 投稿の編集機能を有効にする title: 試験的な機能 - postEditingCaption: 投稿のメニューに既存の投稿を編集するボタンを表示し、他サーバーの編集も受信できるようにします。 - postImportsCaption: + postImportsCaption: ユーザーが過去の投稿をCalckey・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。 enablePostImports: 投稿のインポートを有効にする sendModMail: モデレーション通知を送る deleted: 削除済み editNote: 投稿を編集 -edited: 編集済み +edited: '編集済み: {date} {time}' signupsDisabled: 現在、このサーバーでは新規登録が一般開放されていません。招待コードをお持ちの場合には、以下の欄に入力してください。招待コードをお持ちでない場合にも、新規登録を開放している他のサーバーには入れますよ! findOtherInstance: 他のサーバーを探す diff --git a/locales/nl-NL.yml b/locales/nl-NL.yml index 32cd0b730b..45bc36278a 100644 --- a/locales/nl-NL.yml +++ b/locales/nl-NL.yml @@ -413,7 +413,7 @@ selectList: Selecteer een lijst selectAntenna: Selecteer een antenne deleted: Verwijderd editNote: Bewerk notitie -edited: Bewerkt +edited: 'Bewerkt om {date} {time}' emojis: Emojis emojiName: Emoji naam emojiUrl: Emoji URL diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index fa5ec88d8c..571f6af951 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -1998,7 +1998,7 @@ silenceThisInstance: Wycisz ten serwer silencedInstances: Wyciszone serwery deleted: Usunięte editNote: Edytuj wpis -edited: Edytowany +edited: 'Edytowano o {date} {time}' silenced: Wyciszony findOtherInstance: Znajdź inny serwer userSaysSomethingReasonReply: '{name} odpowiedział na wpis zawierający {reason}' @@ -2029,3 +2029,4 @@ channelFederationWarn: Kanały nie są jeszcze federowane z innymi serwerami newer: nowsze older: starsze cw: Ostrzeżenie zawartości +removeReaction: Usuń reakcję diff --git a/locales/pt_BR.yml b/locales/pt_BR.yml index d56a9fcae4..2cc22c86ab 100644 --- a/locales/pt_BR.yml +++ b/locales/pt_BR.yml @@ -12,3 +12,76 @@ notifications: Notificações password: Senha forgotPassword: Esqueci a senha cancel: Cancelar +noThankYou: Não, obrigade +save: Salvar +enterUsername: Insira nome de usuário +cw: Aviso de conteúdo +driveFileDeleteConfirm: Tem a certeza de que pretende apagar o arquivo "{name}"? O + arquivo será removido de todas as mensagens que o contenham como anexo. +deleteAndEdit: Deletar e editar +import: Importar +exportRequested: Você pediu uma exportação. Isso pode demorar um pouco. Será adicionado + ao seu Drive quando for completo. +note: Postar +notes: Postagens +deleteAndEditConfirm: Você tem certeza que quer deletar esse post e edita-lo? Você + vai perder todas as reações, impulsionamentos e respostas dele. +showLess: Fechar +importRequested: Você requisitou uma importação. Isso pode demorar um pouco. +listsDesc: Listas deixam você criar linhas do tempo com usuários específicos. Elas + podem ser acessadas pela página de linhas do tempo. +edited: 'Editado às {date} {time}' +sendMessage: Enviar uma mensagem +older: antigo +createList: Criar lista +loadMore: Carregar mais +mentions: Menções +importAndExport: Importar/Exportar Dados +files: Arquivos +lists: Listas +manageLists: Gerenciar listas +error: Erro +somethingHappened: Ocorreu um erro +retry: Tentar novamente +renotedBy: Impulsionado por {user} +noNotes: Nenhum post +noNotifications: Nenhuma notificação +instance: Servidor +settings: Configurações +basicSettings: Configurações Básicas +otherSettings: Outras Configurações +openInWindow: Abrir em janela +profile: Perfil +noAccountDescription: Esse usuário ainda não escreveu sua bio. +login: Entrar +loggingIn: Entrando +logout: Sair +signup: Criar conta +uploading: Enviando... +users: Usuários +addUser: Adicione um usuário +addInstance: Adicionar um servidor +cantFavorite: Não foi possível adicionar aos marcadores. +pin: Fixar no perfil +unpin: Desfixar do perfil +copyContent: Copiar conteúdos +copyLink: Copiar link +delete: Deletar +deleted: Deletado +editNote: Editar anotação +addToList: Adicionar a lista +copyUsername: Copiar nome de usuário +searchUser: Procurar por um usuário +reply: Responder +jumpToPrevious: Pular para o anterior +showMore: Mostrar mais +newer: novo +youGotNewFollower: seguiu você +mention: Mencionar +directNotes: Mensagens diretas +export: Exportar +unfollowConfirm: Você tem certez que deseja para de seguir {name}? +noLists: Você não possui nenhuma lista +following: Seguindo +followers: Seguidores +followsYou: Segue você diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index fe90f23d9b..8b3e05a17e 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -1987,5 +1987,5 @@ apps: Приложения silenceThisInstance: Заглушить инстанс silencedInstances: Заглушенные инстансы editNote: Редактировать заметку -edited: Редактировано +edited: 'Редактировано в {date} {time}' deleted: Удалённое diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index a6c9ec5a1e..6c4854f26a 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1,7 +1,7 @@ ---- _lang_: "简体中文" -headlineMisskey: "通过帖子连接在一起的网络" -introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀" +headlineMisskey: "一个开源、去中心化的社交媒体平台,永远免费!🚀" +introMisskey: "欢迎!Calckey 是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n\ + 来探索新的世界吧!🚀" monthAndDay: "{month}月 {day}日" search: "搜索" notifications: "通知" @@ -10,13 +10,13 @@ password: "密码" forgotPassword: "忘记密码" fetchingAsApObject: "正在联邦宇宙查询中" ok: "OK" -gotIt: "我明白了" +gotIt: "知道了!" cancel: "取消" enterUsername: "输入用户名" -renotedBy: "由 {user} 转贴" -noNotes: "没有帖文" +renotedBy: "转发自 {user}" +noNotes: "没有帖子" noNotifications: "无通知" -instance: "实例" +instance: "服务器" settings: "设置" basicSettings: "基本设置" otherSettings: "其他设置" @@ -44,7 +44,7 @@ copyContent: "复制内容" copyLink: "复制链接" delete: "删除" deleteAndEdit: "删除并编辑" -deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。" +deleteAndEditConfirm: "要删除此帖子并再次编辑吗?对此帖子的所有回应、转发和回复也将被删除。" addToList: "添加至列表" sendMessage: "发送" copyUsername: "复制用户名" @@ -64,7 +64,7 @@ import: "导入" export: "导出" files: "文件" download: "下载" -driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会被删除。" +driveFileDeleteConfirm: "要删除文件「{name}」吗?它将被所有作为附件包含它的帖子中删除。" unfollowConfirm: "要取消对{name}的关注吗?" exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。" importRequested: "导入请求已提交,这可能需要花一点时间。" @@ -78,7 +78,7 @@ followsYou: "正在关注你" createList: "创建列表" manageLists: "管理列表" error: "错误" -somethingHappened: "出现了一些问题!" +somethingHappened: "发生了一个错误" retry: "重试" pageLoadError: "页面加载失败。" pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。" @@ -97,7 +97,7 @@ enterEmoji: "输入表情符号" renote: "转发" unrenote: "取消转发" renoted: "已转发。" -cantRenote: "该帖无法转发。" +cantRenote: "此帖子无法转发。" cantReRenote: "转发无法被再次转发。" quote: "引用" pinnedNote: "已置顶的帖子" @@ -111,7 +111,7 @@ enableEmojiReaction: "启用表情符号回应" showEmojisInReactionNotifications: "在回应通知中显示表情符号" reactionSetting: "在选择器中显示的回应" reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。" -rememberNoteVisibility: "保存上次设置的可见性" +rememberNoteVisibility: "保存帖子可见性设置" attachCancel: "删除附件" markAsSensitive: "标记为敏感内容" unmarkAsSensitive: "取消标记为敏感内容" @@ -141,7 +141,7 @@ emojiUrl: "表情符号地址" addEmoji: "添加表情符号" settingGuide: "推荐配置" cacheRemoteFiles: "远程文件缓存" -cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" +cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程服务器载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" flagAsBot: "这是一个机器人账号" flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。" flagAsCat: "将这个账户设定为一只猫" @@ -151,7 +151,7 @@ flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的 autoAcceptFollowed: "自动允许关注者的关注" addAccount: "添加账户" loginFailed: "登录失败" -showOnRemote: "转到所在实例显示" +showOnRemote: "转到所在服务器显示" general: "常规设置" wallpaper: "壁纸" setWallpaper: "设置壁纸" @@ -160,13 +160,13 @@ searchWith: "搜索:{q}" youHaveNoLists: "列表为空" followConfirm: "你确定要关注{name}吗?" proxyAccount: "代理账户" -proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户列出一个远程用户时,如果没有人跟随该列出的用户,则该活动将不会传递到该实例,因此将代之以代理账户。" +proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户列出一个远程用户时,如果没有人跟随该列出的用户,则该活动将不会传递到该服务器,因此将代之以代理账户。" host: "主机名" selectUser: "选择用户" recipient: "收件人" annotation: "注解" federation: "联合" -instances: "实例" +instances: "服务器" registeredAt: "初次观测" latestRequestSentAt: "上次发送的请求" latestRequestReceivedAt: "上次收到的请求" @@ -176,7 +176,7 @@ charts: "图表" perHour: "每小时" perDay: "每天" stopActivityDelivery: "停止发送活动" -blockThisInstance: "阻止此实例向本实例推流" +blockThisInstance: "屏蔽此服务器" operations: "操作" software: "软件" version: "版本" @@ -186,23 +186,23 @@ jobQueue: "作业队列" cpuAndMemory: "CPU和内存" network: "网络" disk: "存储" -instanceInfo: "实例信息" +instanceInfo: "服务器信息" statistics: "统计" clearQueue: "清除队列" clearQueueConfirmTitle: "确定清除队列?" clearQueueConfirmText: "未送达的帖子将不会送达。 通常,您不需要这样做。" clearCachedFiles: "清除缓存" clearCachedFilesConfirm: "确定要清除缓存文件?" -blockedInstances: "被阻拦的实例" -blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。" +blockedInstances: "已屏蔽的服务器" +blockedInstancesDescription: "设定要屏蔽的服务器,以换行来进行分割。被屏蔽的服务器将无法与本服务器进行交换通讯。" muteAndBlock: "屏蔽/拉黑" mutedUsers: "已屏蔽用户" blockedUsers: "被拉黑的用户" noUsers: "无用户" editProfile: "编辑资料" noteDeleteConfirm: "要删除该帖子吗?" -pinLimitExceeded: "无法置顶更多了" -intro: "Misskey的部署结束啦!填写管理员账号吧!" +pinLimitExceeded: "无法置顶更多帖子了" +intro: "Calckey安装完成!请创建一个管理员用户。" done: "完成" processing: "正在处理" preview: "预览" @@ -217,15 +217,15 @@ all: "全部" subscribing: "已订阅" publishing: "直播中" notResponding: "没有响应" -instanceFollowing: "关注实例" -instanceFollowers: "关注实例" -instanceUsers: "实例用户" +instanceFollowing: "关注服务器" +instanceFollowers: "服务器的关注者" +instanceUsers: "此服务器的用户" changePassword: "修改密码" security: "安全" -retypedNotMatch: "两次输入不一致!" +retypedNotMatch: "两次输入不匹配。" currentPassword: "现在的密码" newPassword: "新密码" -newPasswordRetype: "重新输入密码:" +newPasswordRetype: "重新输入新密码" attachFile: "插入附件" more: "更多!" featured: "热门" @@ -309,8 +309,8 @@ unwatch: "取消关注" accept: "允许" reject: "拒绝" normal: "正常" -instanceName: "实例名称" -instanceDescription: "实例介绍" +instanceName: "服务器名称" +instanceDescription: "服务器简介" maintainerName: "管理员名称" maintainerEmail: "管理员电子邮箱" tosUrl: "服务条款URL" @@ -321,7 +321,7 @@ dayX: "{day}日" monthX: "{month}月" yearX: "{year}年" pages: "页面" -integration: "关联" +integration: "整合" connectService: "连接" disconnectService: "断开连接" enableLocalTimeline: "启用本地时间线功能" @@ -340,7 +340,7 @@ basicInfo: "基本信息" pinnedUsers: "置顶用户" pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。" pinnedPages: "固定页面" -pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。" +pinnedPagesDescription: "输入您要固定到服务器首页的页面路径,以换行符分隔。" pinnedClipId: "置顶的便签ID" pinnedNotes: "已置顶的帖子" hcaptcha: "hCaptcha" @@ -359,7 +359,7 @@ antennaSource: "接收来源" antennaKeywords: "包含关键字" antennaExcludeKeywords: "排除关键字" antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范" -notifyAntenna: "开启通知" +notifyAntenna: "新帖子通知" withFileAntenna: "仅带有附件的帖子" enableServiceworker: "启用ServiceWorker" antennaUsersDescription: "指定用户名,用换行符分隔" @@ -391,7 +391,7 @@ nUsersMentioned: "{n} 被提到" securityKey: "安全密钥" securityKeyName: "密钥名称" registerSecurityKey: "注册硬件安全密钥" -lastUsed: "最后使用:" +lastUsed: "上次使用" unregister: "删除账户" passwordLessLogin: "无密码登录" resetPassword: "重置密码" @@ -424,7 +424,7 @@ text: "文本" enable: "启用" next: "下一个" retype: "重新输入" -noteOf: "{user}的帖子" +noteOf: "{user} 的帖子" inviteToGroup: "群组邀请" quoteAttached: "已引用" quoteQuestion: "是否引用此链接内容?" @@ -535,7 +535,7 @@ updateRemoteUser: "更新远程用户信息" deleteAllFiles: "删除所有文件" deleteAllFilesConfirm: "要删除所有文件吗?" removeAllFollowing: "取消所有关注" -removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。" +removeAllFollowingDescription: "取消 {host} 的所有关注者。如果服务器已不存在,请执行它。" userSuspended: "该用户已被冻结。" userSilenced: "该用户已被禁言。" yourAccountSuspendedTitle: "账户已被冻结" @@ -600,7 +600,7 @@ testEmail: "邮件发送测试" wordMute: "文字屏蔽" regexpError: "正则表达式错误" regexpErrorDescription: "{tab} 屏蔽文字的第 {line} 行的正则表达式有错误:" -instanceMute: "实例的屏蔽" +instanceMute: "服务器静音" userSaysSomething: "{name}说了什么" makeActive: "启用" display: "显示" @@ -626,40 +626,40 @@ sample: "示例" abuseReports: "举报" reportAbuse: "举报" reportAbuseOf: "举报{name}" -fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写URL地址。" +fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写 URL 地址。" abuseReported: "内容已发送。感谢您提交信息。" reporter: "举报者" reporteeOrigin: "举报来源" reporterOrigin: "举报者来源" -forwardReport: "将该举报信息转发给远程实例" -forwardReportIsAnonymous: "勾选则在远程实例上显示的举报者是匿名的系统账号,而不是您的账号。" +forwardReport: "将该举报信息转发给远程服务器" +forwardReportIsAnonymous: "勾选则在远程服务器上显示的举报者是匿名的系统账号,而不是您的账号。" send: "发送" abuseMarkAsResolved: "处理完毕" openInNewTab: "在新标签页中打开" openInSideView: "在侧边栏中打开" defaultNavigationBehaviour: "默认导航" editTheseSettingsMayBreakAccount: "编辑这些设置可以会损坏您的账号" -instanceTicker: "帖子的实例信息" +instanceTicker: "帖子的服务器信息" waitingFor: "等待{x}" random: "随机" system: "系统" -switchUi: "切换界面" +switchUi: "界面" desktop: "桌面" clip: "便签" createNew: "新建" optional: "可选" createNewClip: "新建便签" unclip: "移除便签" -confirmToUnclipAlreadyClippedNote: "本帖已包含在便签\"{name}\"里。您想要将本帖从该便签中移除吗?" +confirmToUnclipAlreadyClippedNote: "本帖已包含在便签 \"{name}\" 里。您想要将本帖从该便签中移除吗?" public: "公开" i18nInfo: "Calckey已经被志愿者们翻译成了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。" manageAccessTokens: "管理 Access Tokens" accountInfo: "账户信息" notesCount: "帖子数量" repliesCount: "回复数量" -renotesCount: "转帖数量" +renotesCount: "推贴数量" repliedCount: "回复数" -renotedCount: "转发数" +renotedCount: "收到的推贴数" followingCount: "正在关注数量" followersCount: "关注者数量" sentReactionsCount: "发送回应数" @@ -701,9 +701,9 @@ showTitlebar: "显示标题栏" clearCache: "清除缓存" onlineUsersCount: "{n}人在线" nUsers: "{n}用户" -nNotes: "{n}帖子" +nNotes: "{n} 帖子" sendErrorReports: "发送错误报告" -sendErrorReportsDescription: "启用后,如果出现问题,可以与Misskey共享详细的错误信息,从而帮助提高软件的质量。" +sendErrorReportsDescription: "启用后,如果出现问题,可以与 Misskey 共享详细的错误信息,从而帮助提高软件的质量。" myTheme: "我的主题" backgroundColor: "背景" accentColor: "强调色" @@ -727,7 +727,7 @@ capacity: "容量" inUse: "已使用" editCode: "编辑代码" apply: "应用" -receiveAnnouncementFromInstance: "从实例接收通知" +receiveAnnouncementFromInstance: "从服务器接收通知" emailNotification: "邮件通知" publish: "发布" inChannelSearch: "频道内搜索" @@ -755,11 +755,11 @@ active: "活动" offline: "离线" notRecommended: "不推荐" botProtection: "Bot防御" -instanceBlocking: "被阻拦的实例" +instanceBlocking: "联邦管理" selectAccount: "选择账户" switchAccount: "切换账户" enabled: "已启用" -disabled: "已禁用 " +disabled: "已禁用" quickAction: "快捷操作" user: "用户" administration: "管理" @@ -816,7 +816,7 @@ controlPanel: "控制面板" manageAccounts: "管理账户" makeReactionsPublic: "将回应设置为公开" makeReactionsPublicDescription: "将您发表过的回应设置成公开可见。" -classic: "经典" +classic: "居中" muteThread: "屏蔽帖子列表" unmuteThread: "取消屏蔽帖子列表" ffVisibility: "连接的可见范围" @@ -835,12 +835,12 @@ overridedDeviceKind: "设备类型" smartphone: "智能手机" tablet: "平板" auto: "自动" -themeColor: "主题颜色" +themeColor: "服务器滚动条颜色" size: "大小" numberOfColumn: "列数" searchByGoogle: "Google" -instanceDefaultLightTheme: "实例默认浅色主题" -instanceDefaultDarkTheme: "实例默认深色主题" +instanceDefaultLightTheme: "服务器默认浅色主题" +instanceDefaultDarkTheme: "服务器默认深色主题" instanceDefaultThemeDescription: "以对象格式键入主题代码" mutePeriod: "屏蔽期限" indefinitely: "永久" @@ -863,7 +863,7 @@ check: "检查" driveCapOverrideLabel: "變更此用戶的雲端硬碟容量上限" driveCapOverrideCaption: "设定为 0 以下则会解除此限制。" requireAdminForView: "需要使用管理员账户登录才能查看。" -isSystemAccount: "该账号由系统自动创建和管理。" +isSystemAccount: "该账号由系统自动创建和管理。请不要修改、编辑、删除或以其他方式篡改这个账户,否则可能会破坏你的服务器。" typeToConfirm: "输入 {x} 以确认操作。" deleteAccount: "删除账户" document: "文档" @@ -875,7 +875,7 @@ statusbar: "状态栏" pleaseSelect: "请选择" reverse: "翻转" colored: "彩色" -refreshInterval: "刷新间隔" +refreshInterval: "更新间隔 " label: "标签" type: "类型" speed: "速度" @@ -889,14 +889,17 @@ cannotUploadBecauseInappropriate: "因为可能含有不适宜的内容,无法 cannotUploadBecauseNoFreeSpace: "因为已无可用空间,无法上传。" beta: "测试" enableAutoSensitive: "自动 NSFW 识别" -enableAutoSensitiveDescription: "如果可用,请使用机器学习在媒体上自动设置 NSFW 标志。即使关闭此功能,也可能会根据实例自动设置。" +enableAutoSensitiveDescription: "如果可用,请使用机器学习在媒体上自动设置 NSFW 标志。即使关闭此功能,也可能会根据服务器自动设置。" activeEmailValidationDescription: "积极地验证用户的电子邮件地址,判断它是一次性的电子邮件地址,还是可以实际通信的地址。关闭时,则只检查字符串是否正确。" navbar: "导航栏" shuffle: "随机" account: "账户" move: "移动" customKaTeXMacro: "自定义 KaTeX 宏" -customKaTeXMacroDescription: "使用宏来轻松的输入数学表达式吧!宏的用法与 LaTeX 中的命令定义相同。你可以使用 \\newcommand{\\name}{content} 或 \\newcommand{\\name}[number of arguments]{content} 来输入数学表达式。举个例子,\\newcommand{\\add}[2]{#1 + #2} 会将 \\add{3}{foo} 展开为 3 + foo。此外,宏名称外的花括号 {} 可以被替换为圆括号 () 和方括号 [],这会影响用于参数的括号。每行只能够定义一个宏,无法在中间换行,且无效的行将被忽略。只支持简单字符串替换功能,不支持高级语法,如条件分支等。" +customKaTeXMacroDescription: "使用宏来轻松的输入数学表达式吧!宏的用法与 LaTeX 中的命令定义相同。你可以使用 \\newcommand{\\ + name}{content} 或 \\newcommand{\\name}[number of arguments]{content} 来输入数学表达式。举个例子,\\ + newcommand{\\add}[2]{#1 + #2} 会将 \\add{3}{foo} 展开为 3 + foo。此外,宏名称外的花括号 {} 可以被替换为圆括号 + () 和方括号 [],这会影响用于参数的括号。每行只能够定义一个宏,无法在中间换行,且无效的行将被忽略。只支持简单字符串替换功能,不支持高级语法,如条件分支等。" enableCustomKaTeXMacro: "启用自定义 KaTeX 宏" _sensitiveMediaDetection: description: "可以使用机器学习技术自动检测敏感媒体,以便进行审核。服务器负载将略微增加。" @@ -932,8 +935,8 @@ _ad: reduceFrequencyOfThisAd: "减少此广告的频率" _forgotPassword: enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。" - ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。" - contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。" + ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系服务器管理员。" + contactAdmin: "该服务器不支持发送电子邮件。如果您想重设密码,请联系管理员。" _gallery: my: "我的图库" liked: "喜欢的图片" @@ -981,6 +984,7 @@ _aboutMisskey: donate: "赞助Misskey" morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰" patrons: "支持者" + patronsList: 按时间顺序而不是捐赠金额排列。通过上面的链接捐款,让您的名字出现在这里! _nsfw: respect: "隐藏敏感内容" ignore: "不隐藏敏感内容" @@ -1051,6 +1055,24 @@ _mfm: rotateDescription: "旋转指定的角度。" plain: "简洁" plainDescription: "禁用所有内部语法。" + crop: 裁剪 + scale: 缩放 + position: 位置 + fade: 渐淡 + advanced: 高级 MFM + background: 背景色 + fadeDescription: 内容淡入和淡出。 + warn: MFM 可能包含快速移动或华丽的动画 + advancedDescription: 如果禁用,则仅允许基本标记,除非正在播放动态 MFM + foreground: 前景色 + backgroundDescription: 更改文本的背景色。 + play: 播放 MFM + alwaysPlay: 始终自动播放所有动态的 MFM + stop: 停止播放 MFM + positionDescription: 将内容移动指定的量。 + cropDescription: 裁剪内容。 + scaleDescription: 按指定量缩放内容。 + foregroundDescription: 更改文本的前景色。 _instanceTicker: none: "不显示" remote: "仅远程用户" @@ -1059,6 +1081,7 @@ _serverDisconnectedBehavior: reload: "自动重载" dialog: "对话框警告" quiet: "安静警告" + nothing: 什么也不做 _channel: create: "创建频道" edit: "编辑频道" @@ -1068,7 +1091,7 @@ _channel: owned: "管理中" following: "正在关注" usersCount: "有{n}人参与" - notesCount: "有{n}个帖子" + notesCount: "{n} 帖子" nameAndDescription: "名称与描述" nameOnly: "仅名称" _menuDisplay: @@ -1084,12 +1107,12 @@ _wordMute: hardDescription: "防止将具有指定条件的帖子添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。" soft: "软屏蔽" hard: "硬屏蔽" - mutedNotes: "被屏蔽的帖子" + mutedNotes: "已静音的帖子" _instanceMute: - instanceMuteDescription: "屏蔽配置实例中的所有帖子和转帖,包括实例的用户回复。" + instanceMuteDescription: "屏蔽列出服务器中的所有帖子和转帖,包括服务器的用户回复。" instanceMuteDescription2: "设置时用换行符来分隔" - title: "隐藏实例已设置的帖子。" - heading: "屏蔽实例" + title: "隐藏服务器已设置的帖子。" + heading: "要静音的服务器列表" _theme: explore: "寻找主题" install: "安装主题" @@ -1165,7 +1188,7 @@ _theme: accentLighten: "强调色(浅)" fgHighlighted: "高亮显示文本" _sfx: - note: "帖子" + note: "新的帖子" noteMy: "我的帖子" notification: "通知" chat: "聊天" @@ -1178,7 +1201,7 @@ _ago: secondsAgo: "{n}秒前" minutesAgo: "{n}分前" hoursAgo: "{n}小时前" - daysAgo: "{n}日前" + daysAgo: "{n}天前" weeksAgo: "{n}周前" monthsAgo: "{n}月前" yearsAgo: "{n}年前" @@ -1192,22 +1215,22 @@ _tutorial: step1_1: "欢迎!" step1_2: "让我们把你安排好。你很快就会启动并运行!" step2_1: "首先,请完成您的个人资料。" - step2_2: "通过提供一些关于你自己的信息,其他人会更容易了解他们是否想看到你的帖子或关注你。" - step3_1: "现在是时候跟随一些人了!" + step2_2: "提供一些关于你的信息,让其他人更容易知道他们是否想看你的帖子或关注你。" + step3_1: "现在是时候关注一些人了!" step3_2: "你的主页和社交馈送是基于你所关注的人,所以试着先关注几个账户。{n点击个人资料右上角的加号圈就可以关注它。" step4_1: "让我们出去找你。" - step4_2: "对于他们的第一条信息,有些人喜欢做{introduction}或一个简单的 \"hello world!\"" - step5_1: "时间限制,到处是时间限制!" - step5_2: "您的实例已启用各种时间线的{timelines}。" - step5_3: "主{icon}时间线是你可以看到你的订阅者的帖子的时间线。" - step5_4: "本地{icon}时间线是你可以看到实例中所有其他用户的信息的时间线。" - step5_5: "推荐的{icon}时间线 - 是时间轴,你可以看到管理员推荐的实例的信息" - step5_6: "社交{icon}时间线显示来自你的订阅者朋友的信息。" - step5_7: "全球{icon}时间线是你可以看到来自所有其他连接的实例的消息。" + step4_2: "对于第一条帖子,可以做一个 {introduction} 或一个简单的 \"hello world!\"" + step5_1: "时间线,无处不在的时间线!" + step5_2: "您的服务器已启用{timelines}种不同的时间线。" + step5_3: "主页{icon}时间线是你可以看到你关注账户的帖子的时间线。" + step5_4: "本地{icon}时间线是你可以看到此服务器上其它用户的帖子的时间线。" + step5_5: "社交{icon}时间线是主页和本地时间线的结合。" + step5_6: "推荐{icon}时间线是你可以看到管理员推荐服务器的帖子的时间线。" + step5_7: "全球{icon}时间线是你可以看到来自其它所有互联服务器的帖子的时间线。" step6_1: "那么,这里是什么地方?" - step6_2: "好吧,你不只是加入卡尔基。你已经加入了Fediverse的一个门户,这是一个由成千上万台服务器组成的互联网络,被称为 \"实例\"" + step6_2: "好吧,你不只是加入Calckey。你已经加入了Fediverse的一个门户,这是一个由成千上万台服务器组成的互联网络。" step6_3: "每个服务器的工作方式不同,并不是所有的服务器都运行Calckey。但这个人确实如此! 这有点复杂,但你很快就会明白的。" - step6_4: "现在去学习并享受乐趣!" + step6_4: "现在,去吧,去探索,去享受乐趣吧!" _2fa: alreadyRegistered: "此设备已被注册" registerTOTP: "注册设备" @@ -1218,6 +1241,21 @@ _2fa: step3: "输入您的应用提供的动态口令以完成设置。" step4: "从现在开始,任何登录操作都将要求您提供动态口令。" securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。" + renewTOTPOk: 重新配置 + renewTOTPCancel: 取消 + token: 2FA 令牌 + renewTOTP: 重新配置身份验证器应用程序 + registerTOTPBeforeKey: 请设置一个认证器应用来注册一个安全或通行密钥。 + renewTOTPConfirm: 这将导致您之前的应用程序中的验证码停止工作 + step3Title: 输入验证码 + step2Click: 点击此二维码将允许您在安全密钥或手机验证器应用中注册 2FA。 + securityKeyNotSupported: 您的浏览器不支持安全密钥。 + securityKeyName: 输入密钥名称 + chromePasskeyNotSupported: 目前不支持 Chrome passkeys。 + tapSecurityKey: 请按照您的浏览器的指示注册安全或通行密钥 + removeKey: 移除安全密钥 + removeKeyConfirm: 真的要删除 {name} 密钥吗? + whyTOTPOnlyRenew: 只要注册了安全密钥,就无法删除身份验证器应用程序。 _permissions: "read:account": "查看账户信息" "write:account": "更改帐户信息" @@ -1254,16 +1292,19 @@ _permissions: _auth: shareAccess: "您要授权允许“{name}”访问您的帐户吗?" shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?" - permissionAsk: "这个应用程序需要以下权限" + permissionAsk: "此应用程序请求以下权限:" pleaseGoBack: "请返回到应用程序" callback: "回到应用程序" denied: "拒绝访问" + allPermissions: 完全的账户访问权限 + copyAsk: 请将以下授权码粘贴到应用程序中: _antennaSources: all: "所有帖子" homeTimeline: "已关注用户的帖子" users: "来自指定用户的帖子" userList: "来自指定列表中的帖子" userGroup: "来自指定群组中用户的帖子" + instances: 服务器上所有用户的帖子 _weekday: sunday: "星期日" monday: "星期一" @@ -1280,21 +1321,28 @@ _widgets: trends: "趋势" clock: "时钟" rss: "RSS阅读器" - rssTicker: "RSS Ticker" + rssTicker: "RSS滚动条" activity: "活动" photos: "照片" digitalClock: "数字时钟" unixClock: "UNIX时钟" federation: "联邦宇宙" - instanceCloud: "实例云" - postForm: "投稿窗口" + instanceCloud: "服务器云端" + postForm: "发布窗口" slideshow: "幻灯片展示" button: "按钮" onlineUsers: "在线用户" jobQueue: "作业队列" - serverMetric: "服务器监控" + serverMetric: "服务器指标" aiscript: "AiScript控制台" aichan: "小蓝" + userList: 用户列表 + meiliStatus: 服务器状态 + meiliIndexCount: 已索引的帖子 + meiliSize: 索引大小 + serverInfo: 服务器信息 + _userList: + chooseList: 选择一个列表 _cw: hide: "隐藏" show: "查看更多" @@ -1324,11 +1372,11 @@ _poll: remainingSeconds: "{s}秒后截止" _visibility: public: "公开" - publicDescription: "您的帖子将出现在全局时间线上" - home: "首页" + publicDescription: "您的帖子将出现在公共时间线上" + home: "不公开" homeDescription: "仅发送至首页的时间线" followers: "仅关注者" - followersDescription: "仅发送至关注者" + followersDescription: "仅对你的关注者和提及的用户可见" specified: "指定用户" specifiedDescription: "仅发送至指定用户" localOnly: "仅限本地" @@ -1356,6 +1404,7 @@ _profile: metadataContent: "内容" changeAvatar: "修改头像" changeBanner: "修改横幅" + locationDescription: 如果你先输入你的城市,它将向其他用户显示您的当地时间。 _exportOrImport: allNotes: "所有帖子" followingList: "关注中" @@ -1384,7 +1433,7 @@ _instanceCharts: usersTotal: "用户总计" notes: "帖子:增加/减少" notesTotal: "帖子总计" - ff: "关注/被关注:数量变化" + ff: "被关注用户/关注者的数量差异 " ffTotal: "关注/被关注者总计" cacheSize: "缓存大小:增加/减少" cacheSizeTotal: "缓存大小总计" @@ -1395,6 +1444,7 @@ _timelines: local: "本地" social: "社交" global: "全局" + recommended: 推荐 _pages: newPage: "创建页面" editPage: "编辑页面" @@ -1472,7 +1522,7 @@ _pages: note: "嵌入的帖子" _note: id: "帖子ID" - idDescription: "您也可以通过粘贴帖子的URL来进行设置。" + idDescription: "你也可以将帖子 URL 粘贴到此处。" detailed: "显示详细信息" switch: "开关" _switch: @@ -1721,6 +1771,9 @@ _notification: followBack: "回关" reply: "回复" renote: "转发" + reacted: 对你的帖子做出了回应 + voted: 在你的投票中投了票 + renoted: 推荐了你的帖子 _deck: alwaysShowMainColumn: "总是显示主列" columnAlign: "列对齐" @@ -1733,9 +1786,9 @@ _deck: stackLeft: "向左折叠" popRight: "向右弹出" profile: "配置文件" - newProfile: "新建配置文件" + newProfile: "新建工作区" renameProfile: "重命名配置文件" - deleteProfile: "删除配置文件" + deleteProfile: "删除工作区" nameAlreadyExists: "该配置文件名已存在。" introduction: "将各列进行组合以创建您自己的界面!" introduction2: "您可以随时通过屏幕右侧的 + 来添加列" @@ -1748,4 +1801,143 @@ _deck: antenna: "天线" list: "列表" mentions: "提及" - direct: "指定用户" + direct: "私信" + channel: 频道 +apps: 应用 +_messaging: + dms: 私信 + groups: 群组 +migration: 迁移 +_experiments: + title: 实验性功能 + postImportsCaption: 允许用户从过去的 Calckey、Misskey、Mastodon、Akkoma 和 Pleroma 帐户导入帖子。如果您的队列出现拥堵,则可能会导致加载速度减慢。 + enablePostImports: 启用帖子导入 +license: 许可证 +flagSpeakAsCatDescription: 在猫模式下你的帖子会喵化 +allowedInstances: 白名单服务器 +listsDesc: 列表可以让你创建含有指定用户的时间线,它们可以从时间线页面访问。 +flagSpeakAsCat: 像猫一样说话 +removeReaction: 移除你的回应 +expandOnNoteClick: 点击打开帖子 +expandOnNoteClickDesc: 如果禁用,你仍然可以在右键菜单中或通过点击时间戳打开帖子。 +sendPushNotificationReadMessage: 删除已阅读的推送通知 +customMOTD: 自定义 MOTD(启动屏幕消息) +sendPushNotificationReadMessageCaption: 短暂显示 "{emptyPushNotificationMessage}" 的通知,如果启用,可能会增加你的设备的耗电量。 +adminCustomCssWarn: 仅当你知道此设置的作用时才应使用它。输入不正确的值可能会导致每个人的客户端停止正常运行。请在用户设置中进行测试来确保您的 CSS + 正常工作。 +customMOTDDescription: 自定义 MOTD(启动屏幕)消息,一行一个,每次用户加载/刷新页面时都会随机显示。 +customSplashIconsDescription: 用换行符隔开的自定义闪屏图标的URL,在用户每次加载/重新加载页面时随机显示。请确保图片是在一个静态的 + URL 上,最好全部调整为 192x192 的大小。 +recommendedInstancesDescription: 推荐的服务器以换行符分隔,它们将出现在推荐的时间线中。不要添加 "https://",仅添加域名。 +splash: 启动画面 +showUpdates: Calckey 更新后显示弹出窗口 +selectInstance: 选择一个服务器 +silencedInstances: 静默的服务器 +antennaInstancesDescription: 每行列出一个服务器主机 +pushNotification: 推送通知 +subscribePushNotification: 启用推送通知 +showAdminUpdates: 提示新的 Calckey 版本可用(仅对于管理员) +searchPlaceholder: 搜索 Calckey +addInstance: 添加一个服务器 +jumpToPrevious: 跳转至上一个 +silenceThisInstance: 使此服务器静音 +manageGroups: 管理群组 +antennasDesc: "天线会显示符合您设置条件的新帖子!\n可以从时间线页面访问它们。" +channelFederationWarn: 频道还没有与其他服务器联合 +seperateRenoteQuote: 单独的推荐和引用按钮 +customSplashIcons: 自定义闪屏图标(urls) +alt: 替代文字 +pushNotificationNotSupported: 你的浏览器或者服务器不支持推送通知 +showAds: 显示广告 +enterSendsMessage: 按回车键发送信息(关闭则是 Ctrl + Retun) +recommendedInstances: 推荐服务器 +updateAvailable: 可能有可用更新! +swipeOnMobile: 允许在页面之间滑动 +swipeOnDesktop: 允许在桌面端以移动设备方式滑动 +logoImageUrl: Logo 图像 URL +deleted: 已删除 +editNote: 编辑帖子 +edited: 于 {date} {time} 编辑 +selectChannel: 选择一个频道 +accountMoved: 用户已迁移至新账户: +silencedInstancesDescription: 列出你想静默的服务器的主机名。列出的服务器中的账户被视为 "静默",只能发出跟随请求,如果不被跟随,就不能提及本地账户。这不会影响被封锁的服务器。 +hiddenTags: 隐藏的哈希标签 +userSaysSomethingReason: '{name} 说 {reason}' +clipsDesc: 便签就像可共享的分类书签。您可以从各个帖子的菜单中创建便签。 +privateModeInfo: 当启用时,只有白名单上的服务器可以与你的服务器联合,所有的帖子都会对公共时间线隐藏。 +allowedInstancesDescription: 要列入联合白名单的服务器的主机名,一行一个(仅适用于私密模式)。 +breakFollowConfirm: 你确定要移除关注者吗? +caption: 自动显示说明文字 +newer: 更新的 +older: 更老的 +noInstances: 没有服务器 +silenced: 静默的 +accessibility: 无障碍 +secureMode: 安全模式(仅允许授权的拉取) +replayTutorial: 重播教程 +userSaysSomethingReasonReply: '{name} 回复了包含 {reason} 的帖子' +userSaysSomethingReasonQuote: '{name} 引用了一篇包含 {reason} 的帖子' +userSaysSomethingReasonRenote: '{name} 推荐了一个包含 {reason} 的帖子' +noThankYou: 不,谢谢 +secureModeInfo: 当向其他服务器请求时,不要在没有验证的情况下发回。 +privateMode: 私密模式 +instanceSecurity: 服务器安全 +image: 图像 +video: 视频 +audio: 音频 +cannotUploadBecauseExceedsFileSizeLimit: 无法上传此文件,因为它超出了允许的最大大小。 +unsubscribePushNotification: 禁用推送通知 +pushNotificationAlreadySubscribed: 推送通知已启用 +enableEmojiReactions: 启用 emoji 回应 +cw: 内容警告 +hiddenTagsDescription: 列出你想隐藏的话题标签(不带#)以避免在趋势和探索中显示。隐藏的标签仍然可以通过其他方式被发现。 +enableRecommendedTimeline: 启用推荐时间线 +_skinTones: + medium: 中等 + light: 浅色 + yellow: 黄色 + dark: 深色 + mediumLight: 中等偏淡 + mediumDark: 中等偏深 +isModerator: 协作者 +isAdmin: 管理员 +findOtherInstance: 寻找其它服务器 +moveFromDescription: 这将为您的旧帐户设置一个别名,以便您可以从该旧帐户转移到当前帐户。在从旧帐户转移之前执行此操作。请输入格式如@person@server.com + 的帐户标签 +indexPosts: 索引帖子 +signupsDisabled: 该服务器目前关闭注册,但您随时可以在另一台服务器上注册!如果您有该服务器的邀请码,请在下面输入。 +silencedWarning: 显示这个页面是因为这些用户来自你的管理员设置的静默服务器,所以他们有可能是垃圾信息。 +isBot: 这个账户是一个机器人 +moveAccountDescription: 这个过程是不可逆的。在移动之前,请确保您已在新帐户上为当前帐户设置了别名。请输入格式如 @person@server.com + 帐户标签 +moveFromLabel: 您要移出的旧帐户: +preventAiLearning: 阻止 AI 机器人抓取 +preventAiLearningDescription: 请求第三方人工智能语言模型不要研究您上传的内容,例如帖子和图像。 +noGraze: 请禁用 "Graze for Mastodon" 浏览器扩展,因为它会干扰 Calckey。 +moveTo: 将当前帐户移至新帐户 +moveToLabel: 你要迁移到的目标帐户: +moveAccount: 移动账户! +migrationConfirm: "你确实确定要将帐户迁移到 {account} 吗?此操作无法撤消,并且你将无法再次正常使用旧账户。\n另外,请确保你已将此当前帐户设置为要移出的帐户。" +indexFromDescription: 留空以索引每个帖子 +noteId: 帖子 ID +moveFrom: 从旧帐户移至此帐户 +defaultReaction: 发出和收到的帖子的默认表情符号反应 +indexNotice: 现在开始索引。这可能需要一段时间,请至少一个小时内不要重新启动服务器。 +indexFrom: 从帖子 ID 开始的索引 +sendModMail: 发送审核通知 +isLocked: 该帐户设置了关注请求 +_filters: + notesBefore: 在之前的帖子 + followingOnly: 仅关注中 + notesAfter: 在之后的帖子 + fromDomain: 来自域名 + withFile: 带有文件 + fromUser: 来自用户 + followersOnly: 仅关注者 +reactionPickerSkinTone: 首选的表情符号肤色 +isPatron: Calckey 赞助 +_dialog: + charactersExceeded: 超出了最大字符数!当前:{current} / 限制:{max} + charactersBelow: 没有足够的字符!当前:{current} / 限制:{min} +enableIdenticonGeneration: 启用Identicon生成 +enableServerMachineStats: 启用服务器硬件统计 diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index b4a9fea967..c615bcdcc5 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -1816,7 +1816,6 @@ silenceThisInstance: 靜音此伺服器 silencedInstances: 已靜音的伺服器 silenced: 已靜音 _experiments: - enablePostEditing: 啟用帖子編輯 title: 試驗功能 findOtherInstance: 找找另一個伺服器 noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Calckey發生衝突,請停用該擴展。 @@ -1829,7 +1828,7 @@ indexPosts: 索引帖子 indexNotice: 現在開始索引。 這可能需要一段時間,請不要在一個小時內重啟你的伺服器。 deleted: 已刪除 editNote: 編輯筆記 -edited: 已修改 +edited: '於 {date} {time} 編輯' userSaysSomethingReason: '{name} 說了 {reason}' allowedInstancesDescription: 要加入聯邦白名單的服務器,每台伺服器用新行分隔(僅適用於私有模式)。 defaultReaction: 默認的表情符號反應 diff --git a/package.json b/package.json index 42a18a33c1..3408ce50f9 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,16 @@ { "name": "calckey", - "version": "14.0.0-dev51", + "version": "14.0.0-rc3", "codename": "aqua", "repository": { "type": "git", "url": "https://codeberg.org/calckey/calckey.git" }, - "packageManager": "pnpm@8.6.2", + "packageManager": "pnpm@8.6.3", "private": true, "scripts": { - "rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp", - "build": "pnpm -r run build && pnpm run gulp", + "rebuild": "pnpm run clean && pnpm node ./scripts/build-greet.js && pnpm -r run build && pnpm run gulp", + "build": "pnpm node ./scripts/build-greet.js && pnpm -r run build && pnpm run gulp", "start": "pnpm --filter backend run start", "start:test": "pnpm --filter backend run start:test", "init": "pnpm run migrate", @@ -46,6 +46,7 @@ "devDependencies": { "@types/gulp": "4.0.10", "@types/gulp-rename": "2.0.1", + "chalk": "4.1.2", "cross-env": "7.0.3", "cypress": "10.11.0", "execa": "5.1.1", diff --git a/packages/README.md b/packages/README.md new file mode 100644 index 0000000000..7d7c03e0b5 --- /dev/null +++ b/packages/README.md @@ -0,0 +1,9 @@ +# 📦 Packages + +This directory contains all of the packages Calckey uses. + +- `backend`: Main backend code written in TypeScript for NodeJS +- `backend/native-utils`: Backend code written in Rust, bound to NodeJS by [NAPI-RS](https://napi.rs/) +- `client`: Web interface written in Vue3 and TypeScript +- `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) written in TypeScript +- `calckey-js`: TypeScript SDK for both backend and client, also published on [NPM](https://www.npmjs.com/package/calckey-js) for public use diff --git a/packages/backend/.swcrc b/packages/backend/.swcrc index 39e112ff7c..272d9f698c 100644 --- a/packages/backend/.swcrc +++ b/packages/backend/.swcrc @@ -1,15 +1,15 @@ { - "$schema": "https://json.schemastore.org/swcrc", - "jsc": { - "parser": { - "syntax": "typescript", - "dynamicImport": true, - "decorators": true - }, - "transform": { - "legacyDecorator": true, - "decoratorMetadata": true - }, + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "parser": { + "syntax": "typescript", + "dynamicImport": true, + "decorators": true + }, + "transform": { + "legacyDecorator": true, + "decoratorMetadata": true + }, "experimental": { "keepImportAssertions": true }, @@ -20,6 +20,6 @@ ] }, "target": "es2022" - }, - "minify": false + }, + "minify": false } diff --git a/packages/backend/assets/avatar.png b/packages/backend/assets/avatar.png new file mode 100644 index 0000000000..ee22bdb3c8 Binary files /dev/null and b/packages/backend/assets/avatar.png differ diff --git a/packages/backend/assets/favicon.svg b/packages/backend/assets/favicon.svg index 675d09cc85..e1a3abbbc2 100644 --- a/packages/backend/assets/favicon.svg +++ b/packages/backend/assets/favicon.svg @@ -1 +1 @@ -<svg viewBox="1.95 0.97 128 128" width="128" height="128" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><linearGradient id="a" gradientTransform="rotate(90)"><stop offset="5%" stop-color="#9ccfd8" style="--darkreader-inline-stopcolor:#265760"/><stop offset="95%" stop-color="#31748f" style="--darkreader-inline-stopcolor:#275d72"/></linearGradient><defs><linearGradient xlink:href="#a" id="f" gradientTransform="scale(1.27567 .7839)" x1="-43.77" y1="98.469" x2="-27.05" y2="137.466" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="d" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="e" gradientTransform="scale(1.27567 .7839)" x1="-43.77" y1="98.468" x2="-8.156" y2="98.468" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="c" gradientTransform="scale(1.27567 .7839)" x1="1.571" y1="1.27" x2="133.179" y2="1.27" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="b" gradientTransform="scale(1.27567 .7839)" x1="1.571" y1="1.27" x2="133.179" y2="1.27" gradientUnits="userSpaceOnUse"/></defs><g style="fill:url(#b)" transform="translate(.934 25.196) scale(.75646)"><g style="fill:url(#c)" fill="url(#a)" word-spacing="0" letter-spacing="0" font-family="'OTADESIGN Rounded'" font-weight="400"><g transform="translate(-55.341 -52.023) scale(.26953)" style="fill:url(#d)"/><g style="fill:url(#e)"><path style="fill:url(#f)" d="M-41.832 77.19c-3.868 0-7.177 1.358-9.93 4.074-2.716 2.752-4.074 6.063-4.074 9.931 0 3.869 1.358 7.04 4.074 9.793 2.753 2.716 6.064 4.073 9.932 4.073 3.831 0 7.122-1.357 9.875-4.073.855-.855 1.283-1.896 1.283-3.123 0-1.228-.428-2.271-1.283-3.127-.856-.855-1.897-1.281-3.123-1.281-1.229 0-2.27.426-3.125 1.281-1.004 1.042-2.213 1.563-3.627 1.563-3.035-.31-5.208-2.263-5.246-5.106.038-2.842 2.21-4.935 5.244-5.246 1.414 0 2.623.52 3.627 1.563.855.855 1.898 1.283 3.127 1.283 1.226 0 2.267-.428 3.123-1.283.855-.856 1.283-1.897 1.283-3.125 0-1.227-.428-2.268-1.283-3.123-2.753-2.716-6.046-4.075-9.877-4.075zm20.902 6.91c-2.88 0-5.353 1.02-7.422 3.06-.642.643-.964 1.426-.964 2.348 0 .923.322 1.706.964 2.35.644.642 1.427.962 2.348.962.924 0 1.707-.32 2.35-.963.754-.783 1.662-1.173 2.724-1.173 1.09 0 2.026.376 2.809 1.13a3.909 3.909 0 0 1 1.135 2.811c0 1.062-.393 1.97-1.176 2.725-.392.419-.868.7-1.426.84-.141.027-.252.012-.336-.044-.056-.084-.028-.168.084-.251l.84-.881c.643-.643.965-1.411.965-2.305 0-.922-.28-1.663-.838-2.223-.559-.559-1.343-.84-2.35-.84-.698 0-1.397.35-2.095 1.05l-4.866 4.822c-.643.643-.964 1.426-.964 2.347 0 .923.321 1.705.964 2.348 1.957 1.93 4.375 2.894 7.254 2.894 2.908 0 5.396-1.034 7.465-3.103 2.041-2.041 3.06-4.5 3.06-7.379 0-2.907-1.019-5.396-3.06-7.465-2.069-2.04-4.557-3.06-7.465-3.06z" transform="translate(208.34 -284.25) scale(3.6954)" clip-rule="evenodd" fill-rule="evenodd"/></g></g></g></svg> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" viewBox="1.95 0.97 128 128"><linearGradient id="a" gradientTransform="rotate(90)"><stop offset="5%" stop-color="#9ccfd8" style="--darkreader-inline-stopcolor:#265760"/><stop offset="95%" stop-color="#31748f" style="--darkreader-inline-stopcolor:#275d72"/></linearGradient><defs><linearGradient xlink:href="#a" id="f" x1="-43.77" x2="-27.05" y1="98.469" y2="137.466" gradientTransform="scale(1.27567 .7839)" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="d" x1="0" x2="1" y1="0" y2="0" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="e" x1="-43.77" x2="-8.156" y1="98.468" y2="98.468" gradientTransform="scale(1.27567 .7839)" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="c" x1="1.571" x2="133.179" y1="1.27" y2="1.27" gradientTransform="scale(1.27567 .7839)" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#a" id="b" x1="1.571" x2="133.179" y1="1.27" y2="1.27" gradientTransform="scale(1.27567 .7839)" gradientUnits="userSpaceOnUse"/></defs><g style="fill:url(#b)" transform="translate(.934 25.196) scale(.75646)"><g fill="url(#a)" font-family="'OTADESIGN Rounded'" font-weight="400" letter-spacing="0" style="fill:url(#c)" word-spacing="0"><g style="fill:url(#e)"><path fill-rule="evenodd" d="M-41.832 77.19c-3.868 0-7.177 1.358-9.93 4.074-2.716 2.752-4.074 6.063-4.074 9.931 0 3.869 1.358 7.04 4.074 9.793 2.753 2.716 6.064 4.073 9.932 4.073 3.831 0 7.122-1.357 9.875-4.073.855-.855 1.283-1.896 1.283-3.123 0-1.228-.428-2.271-1.283-3.127-.856-.855-1.897-1.281-3.123-1.281-1.229 0-2.27.426-3.125 1.281-1.004 1.042-2.213 1.563-3.627 1.563-3.035-.31-5.208-2.263-5.246-5.106.038-2.842 2.21-4.935 5.244-5.246 1.414 0 2.623.52 3.627 1.563.855.855 1.898 1.283 3.127 1.283 1.226 0 2.267-.428 3.123-1.283.855-.856 1.283-1.897 1.283-3.125 0-1.227-.428-2.268-1.283-3.123-2.753-2.716-6.046-4.075-9.877-4.075zm20.902 6.91c-2.88 0-5.353 1.02-7.422 3.06-.642.643-.964 1.426-.964 2.348 0 .923.322 1.706.964 2.35.644.642 1.427.962 2.348.962.924 0 1.707-.32 2.35-.963.754-.783 1.662-1.173 2.724-1.173 1.09 0 2.026.376 2.809 1.13a3.909 3.909 0 0 1 1.135 2.811c0 1.062-.393 1.97-1.176 2.725-.392.419-.868.7-1.426.84-.141.027-.252.012-.336-.044-.056-.084-.028-.168.084-.251l.84-.881c.643-.643.965-1.411.965-2.305 0-.922-.28-1.663-.838-2.223-.559-.559-1.343-.84-2.35-.84-.698 0-1.397.35-2.095 1.05l-4.866 4.822c-.643.643-.964 1.426-.964 2.347 0 .923.321 1.705.964 2.348 1.957 1.93 4.375 2.894 7.254 2.894 2.908 0 5.396-1.034 7.465-3.103 2.041-2.041 3.06-4.5 3.06-7.379 0-2.907-1.019-5.396-3.06-7.465-2.069-2.04-4.557-3.06-7.465-3.06z" clip-rule="evenodd" style="fill:url(#f)" transform="translate(208.34 -284.25) scale(3.6954)"/></g></g></g></svg> \ No newline at end of file diff --git a/packages/backend/assets/inverse wordmark.svg b/packages/backend/assets/inverse wordmark.svg index 59125fe7be..c0110540ea 100644 --- a/packages/backend/assets/inverse wordmark.svg +++ b/packages/backend/assets/inverse wordmark.svg @@ -1 +1 @@ -<svg xml:space="preserve" viewBox="0 0 512 512" height="512" width="512" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="a"><stop style="stop-color:#31748f;stop-opacity:1" offset="0"/><stop style="stop-color:#9ccfd8;stop-opacity:1" offset="1"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="254.819" y1="411.542" x2="259.34" y2="-1.41" gradientUnits="userSpaceOnUse"/></defs><path style="fill:url(#b);fill-opacity:1;stroke-width:.996356" d="M0 0v512h512V0Z"/><g style="font-weight:400;font-family:"OTADESIGN Rounded";letter-spacing:0;word-spacing:0;fill:#fff"><g transform="translate(-38.55 37.929) scale(.5619)" style="fill:#fff"/><path style="fill:#fff" d="M-41.832 77.19c-3.868 0-7.177 1.358-9.93 4.074-2.716 2.752-4.074 6.063-4.074 9.931 0 3.869 1.358 7.04 4.074 9.793 2.753 2.716 6.064 4.073 9.932 4.073 3.831 0 7.122-1.357 9.875-4.073.855-.855 1.283-1.896 1.283-3.123 0-1.228-.428-2.271-1.283-3.127-.856-.855-1.897-1.281-3.123-1.281-1.229 0-2.27.426-3.125 1.281-1.004 1.042-2.213 1.563-3.627 1.563-3.035-.31-5.208-2.263-5.246-5.106.038-2.842 2.21-4.935 5.244-5.246 1.414 0 2.623.52 3.627 1.563.855.855 1.898 1.283 3.127 1.283 1.226 0 2.267-.428 3.123-1.283.855-.856 1.283-1.897 1.283-3.125 0-1.227-.428-2.268-1.283-3.123-2.753-2.716-6.046-4.075-9.877-4.075zm20.902 6.91c-2.88 0-5.353 1.02-7.422 3.06-.642.643-.964 1.426-.964 2.348 0 .923.322 1.706.964 2.35.644.642 1.427.962 2.348.962.924 0 1.707-.32 2.35-.963.754-.783 1.662-1.173 2.724-1.173 1.09 0 2.026.376 2.809 1.13a3.909 3.909 0 0 1 1.135 2.811c0 1.062-.393 1.97-1.176 2.725-.392.419-.868.7-1.426.84-.141.027-.252.012-.336-.044-.056-.084-.028-.168.084-.251l.84-.881c.643-.643.965-1.411.965-2.305 0-.922-.28-1.663-.838-2.223-.559-.559-1.343-.84-2.35-.84-.698 0-1.397.35-2.095 1.05l-4.866 4.822c-.643.643-.964 1.426-.964 2.347 0 .923.321 1.705.964 2.348 1.957 1.93 4.375 2.894 7.254 2.894 2.908 0 5.396-1.034 7.465-3.103 2.041-2.041 3.06-4.5 3.06-7.379 0-2.907-1.019-5.396-3.06-7.465-2.069-2.04-4.557-3.06-7.465-3.06z" transform="translate(511.15 -446.2) scale(7.70387)" clip-rule="evenodd" fill-rule="evenodd"/></g></svg> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="512" height="512"><defs><linearGradient id="a"><stop offset="0" style="stop-color:#31748f;stop-opacity:1"/><stop offset="1" style="stop-color:#9ccfd8;stop-opacity:1"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="254.819" x2="259.34" y1="411.542" y2="-1.41" gradientUnits="userSpaceOnUse"/></defs><path d="M0 0v512h512V0Z" style="fill:url(#b);fill-opacity:1;stroke-width:.996356"/><g style="font-weight:400;font-family:"OTADESIGN Rounded";letter-spacing:0;word-spacing:0;fill:#fff"><path fill-rule="evenodd" d="M-41.832 77.19c-3.868 0-7.177 1.358-9.93 4.074-2.716 2.752-4.074 6.063-4.074 9.931 0 3.869 1.358 7.04 4.074 9.793 2.753 2.716 6.064 4.073 9.932 4.073 3.831 0 7.122-1.357 9.875-4.073.855-.855 1.283-1.896 1.283-3.123 0-1.228-.428-2.271-1.283-3.127-.856-.855-1.897-1.281-3.123-1.281-1.229 0-2.27.426-3.125 1.281-1.004 1.042-2.213 1.563-3.627 1.563-3.035-.31-5.208-2.263-5.246-5.106.038-2.842 2.21-4.935 5.244-5.246 1.414 0 2.623.52 3.627 1.563.855.855 1.898 1.283 3.127 1.283 1.226 0 2.267-.428 3.123-1.283.855-.856 1.283-1.897 1.283-3.125 0-1.227-.428-2.268-1.283-3.123-2.753-2.716-6.046-4.075-9.877-4.075zm20.902 6.91c-2.88 0-5.353 1.02-7.422 3.06-.642.643-.964 1.426-.964 2.348 0 .923.322 1.706.964 2.35.644.642 1.427.962 2.348.962.924 0 1.707-.32 2.35-.963.754-.783 1.662-1.173 2.724-1.173 1.09 0 2.026.376 2.809 1.13a3.909 3.909 0 0 1 1.135 2.811c0 1.062-.393 1.97-1.176 2.725-.392.419-.868.7-1.426.84-.141.027-.252.012-.336-.044-.056-.084-.028-.168.084-.251l.84-.881c.643-.643.965-1.411.965-2.305 0-.922-.28-1.663-.838-2.223-.559-.559-1.343-.84-2.35-.84-.698 0-1.397.35-2.095 1.05l-4.866 4.822c-.643.643-.964 1.426-.964 2.347 0 .923.321 1.705.964 2.348 1.957 1.93 4.375 2.894 7.254 2.894 2.908 0 5.396-1.034 7.465-3.103 2.041-2.041 3.06-4.5 3.06-7.379 0-2.907-1.019-5.396-3.06-7.465-2.069-2.04-4.557-3.06-7.465-3.06z" clip-rule="evenodd" style="fill:#fff" transform="translate(511.15 -446.2) scale(7.70387)"/></g></svg> \ No newline at end of file diff --git a/packages/backend/migration/1000000000000-Init.js b/packages/backend/migration/1000000000000-Init.js index d32a6e0d25..bab5fae7a0 100644 --- a/packages/backend/migration/1000000000000-Init.js +++ b/packages/backend/migration/1000000000000-Init.js @@ -220,7 +220,7 @@ export class Init1000000000000 { `CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON "notification" ("notifieeId") `, ); await queryRunner.query( - `CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/static-assets/badges/info.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT '/static-assets/badges/error.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT true, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`, + `CREATE TABLE "meta" ("id" character varying(32) NOT NULL, "name" character varying(128), "description" character varying(1024), "maintainerName" character varying(128), "maintainerEmail" character varying(128), "announcements" jsonb NOT NULL DEFAULT '[]', "disableRegistration" boolean NOT NULL DEFAULT false, "disableLocalTimeline" boolean NOT NULL DEFAULT false, "disableGlobalTimeline" boolean NOT NULL DEFAULT false, "enableEmojiReaction" boolean NOT NULL DEFAULT true, "useStarForReactionFallback" boolean NOT NULL DEFAULT false, "langs" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "hiddenTags" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "blockedHosts" character varying(256) array NOT NULL DEFAULT '{}'::varchar[], "mascotImageUrl" character varying(512) DEFAULT '/static-assets/badges/info.png', "bannerUrl" character varying(512), "errorImageUrl" character varying(512) DEFAULT '/static-assets/badges/error.png', "iconUrl" character varying(512), "cacheRemoteFiles" boolean NOT NULL DEFAULT false, "proxyAccount" character varying(128), "enableRecaptcha" boolean NOT NULL DEFAULT false, "recaptchaSiteKey" character varying(64), "recaptchaSecretKey" character varying(64), "localDriveCapacityMb" integer NOT NULL DEFAULT 1024, "remoteDriveCapacityMb" integer NOT NULL DEFAULT 32, "maxNoteTextLength" integer NOT NULL DEFAULT 500, "summalyProxy" character varying(128), "enableEmail" boolean NOT NULL DEFAULT false, "email" character varying(128), "smtpSecure" boolean NOT NULL DEFAULT false, "smtpHost" character varying(128), "smtpPort" integer, "smtpUser" character varying(128), "smtpPass" character varying(128), "enableServiceWorker" boolean NOT NULL DEFAULT false, "swPublicKey" character varying(128), "swPrivateKey" character varying(128), "enableTwitterIntegration" boolean NOT NULL DEFAULT false, "twitterConsumerKey" character varying(128), "twitterConsumerSecret" character varying(128), "enableGithubIntegration" boolean NOT NULL DEFAULT false, "githubClientId" character varying(128), "githubClientSecret" character varying(128), "enableDiscordIntegration" boolean NOT NULL DEFAULT false, "discordClientId" character varying(128), "discordClientSecret" character varying(128), CONSTRAINT "PK_c4c17a6c2bd7651338b60fc590b" PRIMARY KEY ("id"))`, ); await queryRunner.query( `CREATE TABLE "following" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "followeeId" character varying(32) NOT NULL, "followerId" character varying(32) NOT NULL, "followerHost" character varying(128), "followerInbox" character varying(512), "followerSharedInbox" character varying(512), "followeeHost" character varying(128), "followeeInbox" character varying(512), "followeeSharedInbox" character varying(512), CONSTRAINT "PK_c76c6e044bdf76ecf8bfb82a645" PRIMARY KEY ("id"))`, diff --git a/packages/backend/migration/1688280713783-add-meta-options.js b/packages/backend/migration/1688280713783-add-meta-options.js new file mode 100644 index 0000000000..e97a95c423 --- /dev/null +++ b/packages/backend/migration/1688280713783-add-meta-options.js @@ -0,0 +1,21 @@ +export class AddMetaOptions1688280713783 { + name = "AddMetaOptions1688280713783"; + + async up(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`, + ); + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`, + ); + } + + async down(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`, + ); + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`, + ); + } +} diff --git a/packages/backend/native-utils/migration/Cargo.toml b/packages/backend/native-utils/migration/Cargo.toml index 4dee156ef3..7ed9fd5f03 100644 --- a/packages/backend/native-utils/migration/Cargo.toml +++ b/packages/backend/native-utils/migration/Cargo.toml @@ -10,14 +10,14 @@ path = "src/lib.rs" [features] default = [] -convert = ["dep:native-utils"] +convert = ["dep:native-utils", "dep:indicatif", "dep:futures"] [dependencies] serde_json = "1.0.96" native-utils = { path = "../", optional = true } -indicatif = { version = "0.17.4", features = ["tokio"] } +indicatif = { version = "0.17.4", features = ["tokio"], optional = true } tokio = { version = "1.28.2", features = ["full"] } -futures = "0.3.28" +futures = { version = "0.3.28", optional = true } serde_yaml = "0.9.21" serde = { version = "1.0.163", features = ["derive"] } urlencoding = "2.1.2" diff --git a/packages/backend/native-utils/migration/src/lib.rs b/packages/backend/native-utils/migration/src/lib.rs index 4835c2d3d7..94e2b08cc4 100644 --- a/packages/backend/native-utils/migration/src/lib.rs +++ b/packages/backend/native-utils/migration/src/lib.rs @@ -1,12 +1,16 @@ pub use sea_orm_migration::prelude::*; mod m20230531_180824_drop_reversi; +mod m20230627_185451_index_note_url; pub struct Migrator; #[async_trait::async_trait] impl MigratorTrait for Migrator { fn migrations() -> Vec<Box<dyn MigrationTrait>> { - vec![Box::new(m20230531_180824_drop_reversi::Migration)] + vec![ + Box::new(m20230531_180824_drop_reversi::Migration), + Box::new(m20230627_185451_index_note_url::Migration), + ] } } diff --git a/packages/backend/native-utils/migration/src/m20230627_185451_index_note_url.rs b/packages/backend/native-utils/migration/src/m20230627_185451_index_note_url.rs new file mode 100644 index 0000000000..ceffed9c41 --- /dev/null +++ b/packages/backend/native-utils/migration/src/m20230627_185451_index_note_url.rs @@ -0,0 +1,38 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_index( + Index::create() + .name("IDX_note_url") + .table(Note::Table) + .col(Note::Url) + .if_not_exists() + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_index( + Index::drop() + .name("IDX_note_url") + .table(Note::Table) + .to_owned(), + ) + .await + } +} + +/// Learn more at https://docs.rs/sea-query#iden +#[derive(Iden)] +enum Note { + Table, + Url, +} diff --git a/packages/backend/native-utils/package.json b/packages/backend/native-utils/package.json index 2e6a721f4c..385330d776 100644 --- a/packages/backend/native-utils/package.json +++ b/packages/backend/native-utils/package.json @@ -1,48 +1,50 @@ { - "name": "native-utils", - "version": "0.0.0", - "main": "built/index.js", - "types": "built/index.d.ts", - "napi": { - "name": "native-utils", - "triples": { - "additional": [ - "aarch64-apple-darwin", - "aarch64-linux-android", - "aarch64-unknown-linux-gnu", - "aarch64-unknown-linux-musl", - "aarch64-pc-windows-msvc", - "armv7-unknown-linux-gnueabihf", - "x86_64-unknown-linux-musl", - "x86_64-unknown-freebsd", - "i686-pc-windows-msvc", - "armv7-linux-androideabi", - "universal-apple-darwin" - ] - } - }, - "license": "MIT", - "devDependencies": { - "@napi-rs/cli": "2.16.1", - "ava": "5.1.1" - }, - "ava": { - "timeout": "3m" - }, - "engines": { - "node": ">= 10" - }, - "scripts": { - "artifacts": "napi artifacts", - "build": "napi build --features napi --platform --release ./built/", - "build:debug": "napi build --platform", - "prepublishOnly": "napi prepublish -t npm", - "test": "pnpm run cargo:test && pnpm run build && ava", - "universal": "napi universal", - "version": "napi version", + "name": "native-utils", + "version": "0.0.0", + "main": "built/index.js", + "types": "built/index.d.ts", + "napi": { + "name": "native-utils", + "triples": { + "additional": [ + "aarch64-apple-darwin", + "aarch64-linux-android", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "aarch64-pc-windows-msvc", + "armv7-unknown-linux-gnueabihf", + "x86_64-unknown-linux-musl", + "x86_64-unknown-freebsd", + "i686-pc-windows-msvc", + "armv7-linux-androideabi", + "universal-apple-darwin" + ] + } + }, + "license": "MIT", + "devDependencies": { + "@napi-rs/cli": "2.16.1", + "ava": "5.1.1" + }, + "ava": { + "timeout": "3m" + }, + "engines": { + "node": ">= 10" + }, + "scripts": { + "artifacts": "napi artifacts", + "build": "pnpm run build:napi && pnpm run build:migration", + "build:napi": "napi build --features napi --platform --release ./built/", + "build:migration": "cargo build --locked --release --manifest-path ./migration/Cargo.toml && cp ./target/release/migration ./built/migration", + "build:debug": "napi build --platform ./built/ && cargo build --manifest-path ./migration/Cargo.toml", + "prepublishOnly": "napi prepublish -t npm", + "test": "pnpm run cargo:test && pnpm run build:napi && ava", + "universal": "napi universal", + "version": "napi version", "format": "cargo fmt --all", "cargo:test": "pnpm run cargo:unit && pnpm run cargo:integration", - "cargo:unit": "cargo test unit_test && cargo test -F napi unit_test", - "cargo:integration": "cargo test -F noarray int_test -- --test-threads=1" - } + "cargo:unit": "cargo test unit_test && cargo test -F napi unit_test", + "cargo:integration": "cargo test -F noarray int_test -- --test-threads=1" + } } diff --git a/packages/backend/native-utils/src/mastodon_api.rs b/packages/backend/native-utils/src/mastodon_api.rs index 57119ea73f..3016acd54f 100644 --- a/packages/backend/native-utils/src/mastodon_api.rs +++ b/packages/backend/native-utils/src/mastodon_api.rs @@ -13,18 +13,19 @@ pub enum IdConvertType { #[napi] pub fn convert_id(in_id: String, id_convert_type: IdConvertType) -> napi::Result<String> { + println!("converting id: {}", in_id); use IdConvertType::*; match id_convert_type { MastodonId => { - let mut out: i64 = 0; + let mut out: i128 = 0; for (i, c) in in_id.to_lowercase().chars().rev().enumerate() { - out += num_from_char(c)? as i64 * 36_i64.pow(i as u32); + out += num_from_char(c)? as i128 * 36_i128.pow(i as u32); } Ok(out.to_string()) } CalckeyId => { - let mut input: i64 = match in_id.parse() { + let mut input: i128 = match in_id.parse() { Ok(s) => s, Err(_) => { return Err(Error::new( diff --git a/packages/backend/package.json b/packages/backend/package.json index 2a19b916cf..6f63441023 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -8,10 +8,10 @@ "start:test": "NODE_ENV=test pnpm node ./built/index.js", "migrate": "pnpm run migrate:typeorm && pnpm run migrate:cargo", "migrate:typeorm": "typeorm migration:run -d ormconfig.js", - "migrate:cargo": "cargo run --manifest-path ./native-utils/migration/Cargo.toml -- up", + "migrate:cargo": "./native-utils/built/migration up", "revertmigration": "pnpm run revertmigration:cargo && pnpm run revertmigration:typeorm", "revertmigration:typeorm": "typeorm migration:revert -d ormconfig.js", - "revertmigration:cargo": "cargo run --manifest-path ./native-utils/migration/Cargo.toml -- down", + "revertmigration:cargo": "./native-utils/built/migration down", "check:connect": "node ./check_connect.js", "build": "pnpm swc src -d built -D", "watch": "pnpm swc src -d built -D -w", @@ -20,9 +20,6 @@ "test": "pnpm run mocha", "format": "pnpm rome format * --write" }, - "resolutions": { - "chokidar": "^3.3.1" - }, "optionalDependencies": { "@swc/core-android-arm64": "1.3.11", "@tensorflow/tfjs-node": "3.21.1" @@ -37,6 +34,7 @@ "@koa/cors": "3.4.3", "@koa/multer": "3.0.2", "@koa/router": "9.0.1", + "@msgpack/msgpack": "3.0.0-beta2", "@peertube/http-signature": "1.7.0", "@redocly/openapi-core": "1.0.0-beta.120", "@sinonjs/fake-timers": "9.1.2", @@ -46,7 +44,6 @@ "ajv": "8.12.0", "archiver": "5.3.1", "argon2": "^0.30.3", - "async-mutex": "^0.4.0", "autobind-decorator": "2.4.0", "autolinker": "4.0.0", "autwh": "0.1.0", @@ -115,6 +112,7 @@ "ratelimiter": "3.4.1", "re2": "1.19.0", "redis-lock": "0.1.4", + "redis-semaphore": "5.3.1", "reflect-metadata": "0.1.13", "rename": "1.0.4", "rndstr": "1.0.0", diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 54332c9932..84808413c0 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -20,9 +20,11 @@ export type Source = { host: string; port: number; family?: number; - pass: string; + pass?: string; db?: number; prefix?: string; + user?: string; + tls?: { [y: string]: string }; }; elasticsearch: { host: string; diff --git a/packages/backend/src/daemons/server-stats.ts b/packages/backend/src/daemons/server-stats.ts index c936d619ab..ba74278762 100644 --- a/packages/backend/src/daemons/server-stats.ts +++ b/packages/backend/src/daemons/server-stats.ts @@ -1,6 +1,7 @@ import si from "systeminformation"; import Xev from "xev"; import * as osUtils from "os-utils"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import meilisearch from "../db/meilisearch.js"; const ev = new Xev(); @@ -20,6 +21,9 @@ export default function () { ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50)); }); + const meta = fetchMeta(); + if (!meta.enableServerMachineStats) return; + async function tick() { const cpu = await cpuUsage(); const memStats = await mem(); diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index 0fa5fdff67..89b7a7bf6e 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -207,9 +207,11 @@ export const db = new DataSource({ host: config.redis.host, port: config.redis.port, family: config.redis.family == null ? 0 : config.redis.family, + username: config.redis.user ?? "default", password: config.redis.pass, keyPrefix: `${config.redis.prefix}:query:`, db: config.redis.db || 0, + tls: config.redis.tls, }, } : false, diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts index 6ad3de386f..a1f3279f35 100644 --- a/packages/backend/src/db/redis.ts +++ b/packages/backend/src/db/redis.ts @@ -5,10 +5,12 @@ export function createConnection() { return new Redis({ port: config.redis.port, host: config.redis.host, - family: config.redis.family == null ? 0 : config.redis.family, + family: config.redis.family ?? 0, password: config.redis.pass, + username: config.redis.user ?? "default", keyPrefix: `${config.redis.prefix}:`, db: config.redis.db || 0, + tls: config.redis.tls, }); } diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts index 9abebc91cb..fe68908e57 100644 --- a/packages/backend/src/misc/cache.ts +++ b/packages/backend/src/misc/cache.ts @@ -1,43 +1,85 @@ +import { redisClient } from "@/db/redis.js"; +import { encode, decode } from "@msgpack/msgpack"; +import { ChainableCommander } from "ioredis"; + export class Cache<T> { - public cache: Map<string | null, { date: number; value: T }>; - private lifetime: number; + private ttl: number; + private prefix: string; - constructor(lifetime: Cache<never>["lifetime"]) { - this.cache = new Map(); - this.lifetime = lifetime; + constructor(name: string, ttlSeconds: number) { + this.ttl = ttlSeconds; + this.prefix = `cache:${name}`; } - public set(key: string | null, value: T): void { - this.cache.set(key, { - date: Date.now(), - value, - }); + private prefixedKey(key: string | null): string { + return key ? `${this.prefix}:${key}` : this.prefix; } - public get(key: string | null): T | undefined { - const cached = this.cache.get(key); - if (cached == null) return undefined; - if (Date.now() - cached.date > this.lifetime) { - this.cache.delete(key); - return undefined; + public async set( + key: string | null, + value: T, + transaction?: ChainableCommander, + ): Promise<void> { + const _key = this.prefixedKey(key); + const _value = Buffer.from(encode(value)); + const commander = transaction ?? redisClient; + await commander.set(_key, _value, "EX", this.ttl); + } + + public async get(key: string | null, renew = false): Promise<T | undefined> { + const _key = this.prefixedKey(key); + const cached = await redisClient.getBuffer(_key); + if (cached === null) return undefined; + + if (renew) await redisClient.expire(_key, this.ttl); + + return decode(cached) as T; + } + + public async getAll(renew = false): Promise<Map<string, T>> { + const keys = await redisClient.keys(`${this.prefix}*`); + const map = new Map<string, T>(); + if (keys.length === 0) { + return map; } - return cached.value; + const values = await redisClient.mgetBuffer(keys); + + for (const [i, key] of keys.entries()) { + const val = values[i]; + if (val !== null) { + map.set(key, decode(val) as T); + } + } + + if (renew) { + const trans = redisClient.multi(); + for (const key of map.keys()) { + trans.expire(key, this.ttl); + } + await trans.exec(); + } + + return map; } - public delete(key: string | null) { - this.cache.delete(key); + public async delete(...keys: (string | null)[]): Promise<void> { + if (keys.length > 0) { + const _keys = keys.map(this.prefixedKey); + await redisClient.del(_keys); + } } /** - * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します - * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします + * Returns if cached value exists. Otherwise, calls fetcher and caches. + * Overwrites cached value if invalidated by the optional validator. */ public async fetch( key: string | null, fetcher: () => Promise<T>, + renew = false, validator?: (cachedValue: T) => boolean, ): Promise<T> { - const cachedValue = this.get(key); + const cachedValue = await this.get(key, renew); if (cachedValue !== undefined) { if (validator) { if (validator(cachedValue)) { @@ -52,20 +94,21 @@ export class Cache<T> { // Cache MISS const value = await fetcher(); - this.set(key, value); + await this.set(key, value); return value; } /** - * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します - * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします + * Returns if cached value exists. Otherwise, calls fetcher and caches if the fetcher returns a value. + * Overwrites cached value if invalidated by the optional validator. */ public async fetchMaybe( key: string | null, fetcher: () => Promise<T | undefined>, + renew = false, validator?: (cachedValue: T) => boolean, ): Promise<T | undefined> { - const cachedValue = this.get(key); + const cachedValue = await this.get(key, renew); if (cachedValue !== undefined) { if (validator) { if (validator(cachedValue)) { @@ -81,7 +124,7 @@ export class Cache<T> { // Cache MISS const value = await fetcher(); if (value !== undefined) { - this.set(key, value); + await this.set(key, value); } return value; } diff --git a/packages/backend/src/misc/check-hit-antenna.ts b/packages/backend/src/misc/check-hit-antenna.ts index 358fba0f37..1ff09d6299 100644 --- a/packages/backend/src/misc/check-hit-antenna.ts +++ b/packages/backend/src/misc/check-hit-antenna.ts @@ -11,7 +11,7 @@ import * as Acct from "@/misc/acct.js"; import type { Packed } from "./schema.js"; import { Cache } from "./cache.js"; -const blockingCache = new Cache<User["id"][]>(1000 * 60 * 5); +const blockingCache = new Cache<User["id"][]>("blocking", 60 * 5); // NOTE: フォローしているユーザーのノート、リストのユーザーのノート、グループのユーザーのノート指定はパフォーマンス上の理由で無効になっている diff --git a/packages/backend/src/misc/convert-milliseconds.ts b/packages/backend/src/misc/convert-milliseconds.ts new file mode 100644 index 0000000000..d8c163ffda --- /dev/null +++ b/packages/backend/src/misc/convert-milliseconds.ts @@ -0,0 +1,17 @@ +export function convertMilliseconds(ms: number) { + let seconds = Math.round(ms / 1000); + let minutes = Math.round(seconds / 60); + let hours = Math.round(minutes / 60); + const days = Math.round(hours / 24); + seconds %= 60; + minutes %= 60; + hours %= 24; + + const result = []; + if (days > 0) result.push(`${days} day(s)`); + if (hours > 0) result.push(`${hours} hour(s)`); + if (minutes > 0) result.push(`${minutes} minute(s)`); + if (seconds > 0) result.push(`${seconds} second(s)`); + + return result.join(", "); +} diff --git a/packages/backend/src/misc/emoji-meta.ts b/packages/backend/src/misc/emoji-meta.ts index fd9d9baa5c..2b9365b826 100644 --- a/packages/backend/src/misc/emoji-meta.ts +++ b/packages/backend/src/misc/emoji-meta.ts @@ -1,33 +1,41 @@ import probeImageSize from "probe-image-size"; -import { Mutex, withTimeout } from "async-mutex"; +import { Mutex } from "redis-semaphore"; import { FILE_TYPE_BROWSERSAFE } from "@/const.js"; import Logger from "@/services/logger.js"; import { Cache } from "./cache.js"; +import { redisClient } from "@/db/redis.js"; export type Size = { width: number; height: number; }; -const cache = new Cache<boolean>(1000 * 60 * 10); // once every 10 minutes for the same url -const mutex = withTimeout(new Mutex(), 1000); +const cache = new Cache<boolean>("emojiMeta", 60 * 10); // once every 10 minutes for the same url +const logger = new Logger("emoji"); export async function getEmojiSize(url: string): Promise<Size> { - const logger = new Logger("emoji"); + let attempted = true; - await mutex.runExclusive(() => { - const attempted = cache.get(url); - if (!attempted) { - cache.set(url, true); - } else { - logger.warn(`Attempt limit exceeded: ${url}`); - throw new Error("Too many attempts"); - } - }); + const lock = new Mutex(redisClient, "getEmojiSize"); + await lock.acquire(); try { - logger.info(`Retrieving emoji size from ${url}`); + attempted = (await cache.get(url)) === true; + if (!attempted) { + await cache.set(url, true); + } + } finally { + await lock.release(); + } + + if (attempted) { + logger.warn(`Attempt limit exceeded: ${url}`); + throw new Error("Too many attempts"); + } + + try { + logger.debug(`Retrieving emoji size from ${url}`); const { width, height, mime } = await probeImageSize(url, { timeout: 5000, }); diff --git a/packages/backend/src/misc/is-duplicate-key-value-error.ts b/packages/backend/src/misc/is-duplicate-key-value-error.ts index 18d22bb77c..670277fe1a 100644 --- a/packages/backend/src/misc/is-duplicate-key-value-error.ts +++ b/packages/backend/src/misc/is-duplicate-key-value-error.ts @@ -1,3 +1,4 @@ export function isDuplicateKeyValueError(e: unknown | Error): boolean { - return (e as Error).message?.startsWith("duplicate key value"); + const nodeError = e as NodeJS.ErrnoException; + return nodeError.code === "23505"; } diff --git a/packages/backend/src/misc/keypair-store.ts b/packages/backend/src/misc/keypair-store.ts index 4551bfd988..6255773599 100644 --- a/packages/backend/src/misc/keypair-store.ts +++ b/packages/backend/src/misc/keypair-store.ts @@ -3,10 +3,12 @@ import type { User } from "@/models/entities/user.js"; import type { UserKeypair } from "@/models/entities/user-keypair.js"; import { Cache } from "./cache.js"; -const cache = new Cache<UserKeypair>(Infinity); +const cache = new Cache<UserKeypair>("keypairStore", 60 * 30); export async function getUserKeypair(userId: User["id"]): Promise<UserKeypair> { - return await cache.fetch(userId, () => - UserKeypairs.findOneByOrFail({ userId: userId }), + return await cache.fetch( + userId, + () => UserKeypairs.findOneByOrFail({ userId: userId }), + true, ); } diff --git a/packages/backend/src/misc/populate-emojis.ts b/packages/backend/src/misc/populate-emojis.ts index 7aee4ec253..795a267f91 100644 --- a/packages/backend/src/misc/populate-emojis.ts +++ b/packages/backend/src/misc/populate-emojis.ts @@ -7,8 +7,9 @@ import { isSelfHost, toPunyNullable } from "./convert-host.js"; import { decodeReaction } from "./reaction-lib.js"; import config from "@/config/index.js"; import { query } from "@/prelude/url.js"; +import { redisClient } from "@/db/redis.js"; -const cache = new Cache<Emoji | null>(1000 * 60 * 60 * 12); +const cache = new Cache<Emoji | null>("populateEmojis", 60 * 60 * 12); /** * 添付用絵文字情報 @@ -75,7 +76,7 @@ export async function populateEmoji( if (emoji && !(emoji.width && emoji.height)) { emoji = await queryOrNull(); - cache.set(cacheKey, emoji); + await cache.set(cacheKey, emoji); } if (emoji == null) return null; @@ -150,7 +151,7 @@ export async function prefetchEmojis( emojis: { name: string; host: string | null }[], ): Promise<void> { const notCachedEmojis = emojis.filter( - (emoji) => cache.get(`${emoji.name} ${emoji.host}`) == null, + async (emoji) => !(await cache.get(`${emoji.name} ${emoji.host}`)), ); const emojisQuery: any[] = []; const hosts = new Set(notCachedEmojis.map((e) => e.host)); @@ -169,7 +170,9 @@ export async function prefetchEmojis( select: ["name", "host", "originalUrl", "publicUrl"], }) : []; + const trans = redisClient.multi(); for (const emoji of _emojis) { - cache.set(`${emoji.name} ${emoji.host}`, emoji); + cache.set(`${emoji.name} ${emoji.host}`, emoji, trans); } + await trans.exec(); } diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index b22c6510fa..200ef50552 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -198,7 +198,7 @@ export class Meta { public iconUrl: string | null; @Column("boolean", { - default: true, + default: false, }) public cacheRemoteFiles: boolean; @@ -546,4 +546,14 @@ export class Meta { default: {}, }) public experimentalFeatures: Record<string, unknown>; + + @Column("boolean", { + default: false, + }) + public enableServerMachineStats: boolean; + + @Column("boolean", { + default: true, + }) + public enableIdenticonGeneration: boolean; } diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts index 3be4524933..453179bd6f 100644 --- a/packages/backend/src/models/repositories/note.ts +++ b/packages/backend/src/models/repositories/note.ts @@ -28,7 +28,7 @@ import { import { db } from "@/db/postgre.js"; import { IdentifiableError } from "@/misc/identifiable-error.js"; -async function populatePoll(note: Note, meId: User["id"] | null) { +export async function populatePoll(note: Note, meId: User["id"] | null) { const poll = await Polls.findOneByOrFail({ noteId: note.id }); const choices = poll.choices.map((c) => ({ text: c, diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 48c8d75b3b..5ca36e3d31 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -1,4 +1,3 @@ -import { URL } from "url"; import { In, Not } from "typeorm"; import Ajv from "ajv"; import type { ILocalUser, IRemoteUser } from "@/models/entities/user.js"; @@ -40,7 +39,10 @@ import { } from "../index.js"; import type { Instance } from "../entities/instance.js"; -const userInstanceCache = new Cache<Instance | null>(1000 * 60 * 60 * 3); +const userInstanceCache = new Cache<Instance | null>( + "userInstance", + 60 * 60 * 3, +); type IsUserDetailed<Detailed extends boolean> = Detailed extends true ? Packed<"UserDetailed"> diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts index a84a446fe7..d7580a4f62 100644 --- a/packages/backend/src/queue/index.ts +++ b/packages/backend/src/queue/index.ts @@ -482,7 +482,8 @@ export function createCleanRemoteFilesJob() { export function createIndexAllNotesJob(data = {}) { return backgroundQueue.add("indexAllNotes", data, { removeOnComplete: true, - removeOnFail: true, + removeOnFail: false, + timeout: 1000 * 60 * 60 * 24, }); } diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts index 0686fe9cd3..16e623d137 100644 --- a/packages/backend/src/queue/initialize.ts +++ b/packages/backend/src/queue/initialize.ts @@ -7,8 +7,10 @@ export function initialize<T>(name: string, limitPerSec = -1) { port: config.redis.port, host: config.redis.host, family: config.redis.family == null ? 0 : config.redis.family, + username: config.redis.user ?? "default", password: config.redis.pass, db: config.redis.db || 0, + tls: config.redis.tls, }, prefix: config.redis.prefix ? `${config.redis.prefix}:queue` : "queue", limiter: diff --git a/packages/backend/src/queue/processors/background/index-all-notes.ts b/packages/backend/src/queue/processors/background/index-all-notes.ts index 10c332aa3b..1dce4406a9 100644 --- a/packages/backend/src/queue/processors/background/index-all-notes.ts +++ b/packages/backend/src/queue/processors/background/index-all-notes.ts @@ -20,7 +20,7 @@ export default async function indexAllNotes( let total: number = (job.data.total as number) ?? 0; let running = true; - const take = 50000; + const take = 100000; const batch = 100; while (running) { logger.info( diff --git a/packages/backend/src/queue/processors/db/delete-account.ts b/packages/backend/src/queue/processors/db/delete-account.ts index a356ca7abf..1cd7642ba5 100644 --- a/packages/backend/src/queue/processors/db/delete-account.ts +++ b/packages/backend/src/queue/processors/db/delete-account.ts @@ -17,9 +17,7 @@ export async function deleteAccount( logger.info(`Deleting account of ${job.data.user.id} ...`); const user = await Users.findOneBy({ id: job.data.user.id }); - if (user == null) { - return; - } + if (!user) return; { // Delete notes diff --git a/packages/backend/src/queue/processors/ended-poll-notification.ts b/packages/backend/src/queue/processors/ended-poll-notification.ts index 9fe57d8da3..e3d860ac82 100644 --- a/packages/backend/src/queue/processors/ended-poll-notification.ts +++ b/packages/backend/src/queue/processors/ended-poll-notification.ts @@ -1,9 +1,9 @@ import type Bull from "bull"; -import { In } from "typeorm"; -import { Notes, Polls, PollVotes } from "@/models/index.js"; +import { Notes, PollVotes } from "@/models/index.js"; import { queueLogger } from "../logger.js"; import type { EndedPollNotificationJobData } from "@/queue/types.js"; import { createNotification } from "@/services/create-notification.js"; +import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; const logger = queueLogger.createSubLogger("ended-poll-notification"); @@ -32,5 +32,8 @@ export async function endedPollNotification( }); } + // Broadcast the poll result once it ends + await deliverQuestionUpdate(note.id); + done(); } diff --git a/packages/backend/src/remote/activitypub/check-fetch.ts b/packages/backend/src/remote/activitypub/check-fetch.ts index a8bbe61b84..c885b4a199 100644 --- a/packages/backend/src/remote/activitypub/check-fetch.ts +++ b/packages/backend/src/remote/activitypub/check-fetch.ts @@ -7,6 +7,8 @@ import DbResolver from "@/remote/activitypub/db-resolver.js"; import { getApId } from "@/remote/activitypub/type.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js"; import type { IncomingMessage } from "http"; +import type { CacheableRemoteUser } from "@/models/entities/user.js"; +import type { UserPublickey } from "@/models/entities/user-publickey.js"; export async function hasSignature(req: IncomingMessage): Promise<string> { const meta = await fetchMeta(); @@ -95,3 +97,22 @@ export async function checkFetch(req: IncomingMessage): Promise<number> { } return 200; } + +export async function getSignatureUser(req: IncomingMessage): Promise<{ + user: CacheableRemoteUser; + key: UserPublickey | null; +} | null> { + const signature = httpSignature.parseRequest(req, { headers: [] }); + const keyId = new URL(signature.keyId); + const dbResolver = new DbResolver(); + + // Retrieve from DB by HTTP-Signature keyId + const authUser = await dbResolver.getAuthUserFromKeyId(signature.keyId); + if (authUser) { + return authUser; + } + + // Resolve if failed to retrieve by keyId + keyId.hash = ""; + return await dbResolver.getAuthUserFromApId(getApId(keyId.toString())); +} diff --git a/packages/backend/src/remote/activitypub/db-resolver.ts b/packages/backend/src/remote/activitypub/db-resolver.ts index 44ff70c56c..a710b9f115 100644 --- a/packages/backend/src/remote/activitypub/db-resolver.ts +++ b/packages/backend/src/remote/activitypub/db-resolver.ts @@ -5,7 +5,6 @@ import type { CacheableRemoteUser, CacheableUser, } from "@/models/entities/user.js"; -import { User, IRemoteUser } from "@/models/entities/user.js"; import type { UserPublickey } from "@/models/entities/user-publickey.js"; import type { MessagingMessage } from "@/models/entities/messaging-message.js"; import { @@ -20,8 +19,11 @@ import type { IObject } from "./type.js"; import { getApId } from "./type.js"; import { resolvePerson } from "./models/person.js"; -const publicKeyCache = new Cache<UserPublickey | null>(Infinity); -const publicKeyByUserIdCache = new Cache<UserPublickey | null>(Infinity); +const publicKeyCache = new Cache<UserPublickey | null>("publicKey", 60 * 30); +const publicKeyByUserIdCache = new Cache<UserPublickey | null>( + "publicKeyByUserId", + 60 * 30, +); export type UriParseResult = | { @@ -80,8 +82,15 @@ export default class DbResolver { id: parsed.id, }); } else { - return await Notes.findOneBy({ - uri: parsed.uri, + return await Notes.findOne({ + where: [ + { + uri: parsed.uri, + }, + { + url: parsed.uri, + }, + ], }); } } @@ -116,17 +125,23 @@ export default class DbResolver { if (parsed.type !== "users") return null; return ( - (await userByIdCache.fetchMaybe(parsed.id, () => - Users.findOneBy({ - id: parsed.id, - }).then((x) => x ?? undefined), + (await userByIdCache.fetchMaybe( + parsed.id, + () => + Users.findOneBy({ + id: parsed.id, + }).then((x) => x ?? undefined), + true, )) ?? null ); } else { - return await uriPersonCache.fetch(parsed.uri, () => - Users.findOneBy({ - uri: parsed.uri, - }), + return await uriPersonCache.fetch( + parsed.uri, + () => + Users.findOneBy({ + uri: parsed.uri, + }), + true, ); } } @@ -149,14 +164,17 @@ export default class DbResolver { return key; }, + true, (key) => key != null, ); if (key == null) return null; return { - user: (await userByIdCache.fetch(key.userId, () => - Users.findOneByOrFail({ id: key.userId }), + user: (await userByIdCache.fetch( + key.userId, + () => Users.findOneByOrFail({ id: key.userId }), + true, )) as CacheableRemoteUser, key, }; @@ -176,6 +194,7 @@ export default class DbResolver { const key = await publicKeyByUserIdCache.fetch( user.id, () => UserPublickeys.findOneBy({ userId: user.id }), + true, (v) => v != null, ); diff --git a/packages/backend/src/remote/activitypub/kernel/delete/actor.ts b/packages/backend/src/remote/activitypub/kernel/delete/actor.ts index 3571135aa5..83c6442dde 100644 --- a/packages/backend/src/remote/activitypub/kernel/delete/actor.ts +++ b/packages/backend/src/remote/activitypub/kernel/delete/actor.ts @@ -15,9 +15,11 @@ export async function deleteActor( return `skip: delete actor ${actor.uri} !== ${uri}`; } - const user = await Users.findOneByOrFail({ id: actor.id }); - if (user.isDeleted) { - logger.info("skip: already deleted"); + const user = await Users.findOneBy({ id: actor.id }); + if (!user) { + return `skip: actor ${actor.id} not found in the local database`; + } else if (user.isDeleted) { + return `skip: user ${user.id} already deleted`; } const job = await createDeleteAccountJob(actor); diff --git a/packages/backend/src/remote/activitypub/models/image.ts b/packages/backend/src/remote/activitypub/models/image.ts index 211aa3931e..b5eece0f6e 100644 --- a/packages/backend/src/remote/activitypub/models/image.ts +++ b/packages/backend/src/remote/activitypub/models/image.ts @@ -26,11 +26,11 @@ export async function createImage( const image = (await new Resolver().resolve(value)) as any; if (image.url == null) { - throw new Error("invalid image: url not privided"); + throw new Error("Invalid image, URL not provided"); } if (!image.url.startsWith("https://") && !image.url.startsWith("http://")) { - throw new Error("invalid image: unexpected shcema of url: " + image.url); + throw new Error(`Invalid image, unexpected schema: ${image.url}`); } logger.info(`Creating the Image: ${image.url}`); diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 73589125b4..a3141e388a 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -13,11 +13,10 @@ import type { import { htmlToMfm } from "../misc/html-to-mfm.js"; import { extractApHashtags } from "./tag.js"; import { unique, toArray, toSingle } from "@/prelude/array.js"; -import { extractPollFromQuestion, updateQuestion } from "./question.js"; +import { extractPollFromQuestion } from "./question.js"; import vote from "@/services/note/polls/vote.js"; import { apLogger } from "../logger.js"; import { DriveFile } from "@/models/entities/drive-file.js"; -import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { extractDbHost, toPuny } from "@/misc/convert-host.js"; import { Emojis, @@ -334,9 +333,6 @@ export async function createNote( `vote from AP: actor=${actor.username}@${actor.host}, note=${note.id}, choice=${name}`, ); await vote(actor, reply, index); - - // リモートフォロワーにUpdate配信 - deliverQuestionUpdate(reply.id); } return null; }; @@ -545,10 +541,6 @@ function notEmpty(partial: Partial<any>) { export async function updateNote(value: string | IObject, resolver?: Resolver) { const uri = typeof value === "string" ? value : value.id; if (!uri) throw new Error("Missing note uri"); - const instanceMeta = await fetchMeta(); - if (instanceMeta.experimentalFeatures?.postEdits === false) { - throw new Error("Post edits disabled."); - } // Skip if URI points to this server if (uri.startsWith(`${config.url}/`)) throw new Error("uri points local"); diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index f8208e6d7b..c5519ba031 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -135,14 +135,14 @@ export async function fetchPerson( ): Promise<CacheableUser | null> { if (typeof uri !== "string") throw new Error("uri is not string"); - const cached = uriPersonCache.get(uri); + const cached = await uriPersonCache.get(uri, true); if (cached) return cached; // Fetch from the database if the URI points to this server if (uri.startsWith(`${config.url}/`)) { const id = uri.split("/").pop(); const u = await Users.findOneBy({ id }); - if (u) uriPersonCache.set(uri, u); + if (u) await uriPersonCache.set(uri, u); return u; } @@ -150,7 +150,7 @@ export async function fetchPerson( const exist = await Users.findOneBy({ uri }); if (exist) { - uriPersonCache.set(uri, exist); + await uriPersonCache.set(uri, exist); return exist; } //#endregion diff --git a/packages/backend/src/remote/activitypub/models/question.ts b/packages/backend/src/remote/activitypub/models/question.ts index 520b9fee94..f5855c3e7c 100644 --- a/packages/backend/src/remote/activitypub/models/question.ts +++ b/packages/backend/src/remote/activitypub/models/question.ts @@ -1,7 +1,7 @@ import config from "@/config/index.js"; import Resolver from "../resolver.js"; import type { IObject, IQuestion } from "../type.js"; -import { isQuestion } from "../type.js"; +import { getApId, isQuestion } from "../type.js"; import { apLogger } from "../logger.js"; import { Notes, Polls } from "@/models/index.js"; import type { IPoll } from "@/models/entities/poll.js"; @@ -47,11 +47,14 @@ export async function extractPollFromQuestion( /** * Update votes of Question - * @param uri URI of AP Question object + * @param value URI of AP Question object or object itself * @returns true if updated */ -export async function updateQuestion(value: any, resolver?: Resolver) { - const uri = typeof value === "string" ? value : value.id; +export async function updateQuestion( + value: string | IQuestion, + resolver?: Resolver, +): Promise<boolean> { + const uri = typeof value === "string" ? value : getApId(value); // Skip if URI points to this server if (uri.startsWith(`${config.url}/`)) throw new Error("uri points local"); @@ -65,22 +68,23 @@ export async function updateQuestion(value: any, resolver?: Resolver) { //#endregion // resolve new Question object - if (resolver == null) resolver = new Resolver(); - const question = (await resolver.resolve(value)) as IQuestion; + const _resolver = resolver ?? new Resolver(); + const question = (await _resolver.resolve(value)) as IQuestion; apLogger.debug(`fetched question: ${JSON.stringify(question, null, 2)}`); if (question.type !== "Question") throw new Error("object is not a Question"); const apChoices = question.oneOf || question.anyOf; + if (!apChoices) return false; let changed = false; for (const choice of poll.choices) { const oldCount = poll.votes[poll.choices.indexOf(choice)]; - const newCount = apChoices!.filter((ap) => ap.name === choice)[0].replies! - .totalItems; + const newCount = apChoices.filter((ap) => ap.name === choice)[0].replies + ?.totalItems; - if (oldCount !== newCount) { + if (newCount !== undefined && oldCount !== newCount) { changed = true; poll.votes[poll.choices.indexOf(choice)] = newCount; } diff --git a/packages/backend/src/remote/activitypub/request.ts b/packages/backend/src/remote/activitypub/request.ts index ffb3e25a33..69c97a445d 100644 --- a/packages/backend/src/remote/activitypub/request.ts +++ b/packages/backend/src/remote/activitypub/request.ts @@ -3,6 +3,7 @@ import { getUserKeypair } from "@/misc/keypair-store.js"; import type { User } from "@/models/entities/user.js"; import { getResponse } from "../../misc/fetch.js"; import { createSignedPost, createSignedGet } from "./ap-request.js"; +import { apLogger } from "@/remote/activitypub/logger.js"; export default async (user: { id: User["id"] }, url: string, object: any) => { const body = JSON.stringify(object); @@ -35,6 +36,7 @@ export default async (user: { id: User["id"] }, url: string, object: any) => { * @param url URL to fetch */ export async function signedGet(url: string, user: { id: User["id"] }) { + apLogger.debug(`Running signedGet on url: ${url}`); const keypair = await getUserKeypair(user.id); const req = createSignedGet({ diff --git a/packages/backend/src/remote/activitypub/resolver.ts b/packages/backend/src/remote/activitypub/resolver.ts index 0547927609..608ca3e935 100644 --- a/packages/backend/src/remote/activitypub/resolver.ts +++ b/packages/backend/src/remote/activitypub/resolver.ts @@ -23,6 +23,7 @@ import renderCreate from "@/remote/activitypub/renderer/create.js"; import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import renderFollow from "@/remote/activitypub/renderer/follow.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js"; +import { apLogger } from "@/remote/activitypub/logger.js"; export default class Resolver { private history: Set<string>; @@ -34,6 +35,15 @@ export default class Resolver { this.recursionLimit = recursionLimit; } + public setUser(user) { + this.user = user; + } + + public reset(): Resolver { + this.history = new Set(); + return this; + } + public getHistory(): string[] { return Array.from(this.history); } @@ -56,15 +66,20 @@ export default class Resolver { } if (typeof value !== "string") { + apLogger.debug("Object to resolve is not a string"); if (typeof value.id !== "undefined") { const host = extractDbHost(getApId(value)); if (await shouldBlockInstance(host)) { throw new Error("instance is blocked"); } } + apLogger.debug("Returning existing object:"); + apLogger.debug(JSON.stringify(value, null, 2)); return value; } + apLogger.debug(`Resolving: ${value}`); + if (value.includes("#")) { // URLs with fragment parts cannot be resolved correctly because // the fragment part does not get transmitted over HTTP(S). @@ -102,6 +117,9 @@ export default class Resolver { this.user = await getInstanceActor(); } + apLogger.debug("Getting object from remote, authenticated as user:"); + apLogger.debug(JSON.stringify(this.user, null, 2)); + const object = ( this.user ? await signedGet(value, this.user) diff --git a/packages/backend/src/server/activitypub.ts b/packages/backend/src/server/activitypub.ts index 042ab446c7..f9d5eb99c3 100644 --- a/packages/backend/src/server/activitypub.ts +++ b/packages/backend/src/server/activitypub.ts @@ -20,7 +20,11 @@ import { import type { ILocalUser, User } from "@/models/entities/user.js"; import { renderLike } from "@/remote/activitypub/renderer/like.js"; import { getUserKeypair } from "@/misc/keypair-store.js"; -import { checkFetch, hasSignature } from "@/remote/activitypub/check-fetch.js"; +import { + checkFetch, + hasSignature, + getSignatureUser, +} from "@/remote/activitypub/check-fetch.js"; import { getInstanceActor } from "@/services/instance-actor.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; import renderFollow from "@/remote/activitypub/renderer/follow.js"; @@ -28,6 +32,7 @@ import Featured from "./activitypub/featured.js"; import Following from "./activitypub/following.js"; import Followers from "./activitypub/followers.js"; import Outbox, { packActivity } from "./activitypub/outbox.js"; +import { serverLogger } from "./index.js"; // Init router const router = new Router(); @@ -84,7 +89,7 @@ router.get("/notes/:note", async (ctx, next) => { const note = await Notes.findOneBy({ id: ctx.params.note, - visibility: In(["public" as const, "home" as const]), + visibility: In(["public" as const, "home" as const, "followers" as const]), localOnly: false, }); @@ -103,6 +108,37 @@ router.get("/notes/:note", async (ctx, next) => { return; } + if (note.visibility === "followers") { + serverLogger.debug( + "Responding to request for follower-only note, validating access...", + ); + const remoteUser = await getSignatureUser(ctx.req); + serverLogger.debug("Local note author user:"); + serverLogger.debug(JSON.stringify(note, null, 2)); + serverLogger.debug("Authenticated remote user:"); + serverLogger.debug(JSON.stringify(remoteUser, null, 2)); + + if (remoteUser == null) { + serverLogger.debug("Rejecting: no user"); + ctx.status = 401; + return; + } + + const relation = await Users.getRelation(remoteUser.user.id, note.userId); + serverLogger.debug("Relation:"); + serverLogger.debug(JSON.stringify(relation, null, 2)); + + if (!relation.isFollowing || relation.isBlocked) { + serverLogger.debug( + "Rejecting: authenticated user is not following us or was blocked by us", + ); + ctx.status = 403; + return; + } + + serverLogger.debug("Accepting: access criteria met"); + } + ctx.body = renderActivity(await renderNote(note, false)); const meta = await fetchMeta(); diff --git a/packages/backend/src/server/api/authenticate.ts b/packages/backend/src/server/api/authenticate.ts index 42274ad2a4..460a0ce84b 100644 --- a/packages/backend/src/server/api/authenticate.ts +++ b/packages/backend/src/server/api/authenticate.ts @@ -9,7 +9,7 @@ import { localUserByNativeTokenCache, } from "@/services/user-cache.js"; -const appCache = new Cache<App>(Infinity); +const appCache = new Cache<App>("app", 60 * 30); export class AuthenticationError extends Error { constructor(message: string) { @@ -49,6 +49,7 @@ export default async ( const user = await localUserByNativeTokenCache.fetch( token, () => Users.findOneBy({ token }) as Promise<ILocalUser | null>, + true, ); if (user == null) { @@ -82,11 +83,14 @@ export default async ( Users.findOneBy({ id: accessToken.userId, }) as Promise<ILocalUser>, + true, ); if (accessToken.appId) { - const app = await appCache.fetch(accessToken.appId, () => - Apps.findOneByOrFail({ id: accessToken.appId! }), + const app = await appCache.fetch( + accessToken.appId, + () => Apps.findOneByOrFail({ id: accessToken.appId! }), + true, ); return [ diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts index 45471ed564..0a1027b835 100644 --- a/packages/backend/src/server/api/call.ts +++ b/packages/backend/src/server/api/call.ts @@ -66,8 +66,11 @@ export default async ( limit as IEndpointMeta["limit"] & { key: NonNullable<string> }, limitActor, ).catch((e) => { + const remainingTime = e.remainingTime + ? `Please try again in ${e.remainingTime}.` + : "Please try again later."; throw new ApiError({ - message: "Rate limit exceeded. Please try again later.", + message: `Rate limit exceeded. ${remainingTime}`, code: "RATE_LIMIT_EXCEEDED", id: "d5826d14-3982-4d2e-8011-b9e9f02499ef", httpStatusCode: 429, @@ -94,7 +97,7 @@ export default async ( } if (ep.meta.requireAdmin && !user!.isAdmin) { - throw new ApiError(accessDenied, { reason: "You are not the admin." }); + throw new ApiError(accessDenied, { reason: "You are not an admin." }); } if (ep.meta.requireModerator && !isModerator) { diff --git a/packages/backend/src/server/api/compatibility.ts b/packages/backend/src/server/api/compatibility.ts index 7e44fa8b2e..42be40e104 100644 --- a/packages/backend/src/server/api/compatibility.ts +++ b/packages/backend/src/server/api/compatibility.ts @@ -1,11 +1,13 @@ import type { IEndpoint } from "./endpoints"; -import * as cp___instanceInfo from "./endpoints/compatibility/instance-info.js"; -import * as cp___customEmojis from "./endpoints/compatibility/custom-emojis.js"; +import * as cp___instance_info from "./endpoints/compatibility/instance-info.js"; +import * as cp___custom_emojis from "./endpoints/compatibility/custom-emojis.js"; +import * as ep___instance_peers from "./endpoints/compatibility/peers.js"; const cps = [ - ["v1/instance", cp___instanceInfo], - ["v1/custom_emojis", cp___customEmojis], + ["v1/instance", cp___instance_info], + ["v1/custom_emojis", cp___custom_emojis], + ["v1/instance/peers", ep___instance_peers], ]; const compatibility: IEndpoint[] = cps.map(([name, cp]) => { diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts index 7d40816135..4366406ec3 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts @@ -6,7 +6,7 @@ import { ApiError } from "../../../error.js"; import rndstr from "rndstr"; import { publishBroadcastStream } from "@/services/stream.js"; import { db } from "@/db/postgre.js"; -import { type Size, getEmojiSize } from "@/misc/emoji-meta.js"; +import { getEmojiSize } from "@/misc/emoji-meta.js"; export const meta = { tags: ["admin"], @@ -40,12 +40,7 @@ export default define(meta, paramDef, async (ps, me) => { ? file.name.split(".")[0] : `_${rndstr("a-z0-9", 8)}_`; - let size: Size = { width: 0, height: 0 }; - try { - size = await getEmojiSize(file.url); - } catch { - /* skip if any error happens */ - } + const size = await getEmojiSize(file.url); const emoji = await Emojis.insert({ id: genId(), diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts index 45cb9464db..c90e606335 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts @@ -6,7 +6,7 @@ import type { DriveFile } from "@/models/entities/drive-file.js"; import { uploadFromUrl } from "@/services/drive/upload-from-url.js"; import { publishBroadcastStream } from "@/services/stream.js"; import { db } from "@/db/postgre.js"; -import { type Size, getEmojiSize } from "@/misc/emoji-meta.js"; +import { getEmojiSize } from "@/misc/emoji-meta.js"; export const meta = { tags: ["admin"], @@ -65,12 +65,7 @@ export default define(meta, paramDef, async (ps, me) => { throw new ApiError(); } - let size: Size = { width: 0, height: 0 }; - try { - size = await getEmojiSize(driveFile.url); - } catch { - /* skip if any error happens */ - } + const size = await getEmojiSize(driveFile.url); const copied = await Emojis.insert({ id: genId(), diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index ad70310633..50317d4a81 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -476,14 +476,21 @@ export const meta = { optional: true, nullable: true, properties: { - postEditing: { - type: "boolean", - }, postImports: { type: "boolean", }, }, }, + enableServerMachineStats: { + type: "boolean", + optional: false, + nullable: false, + }, + enableIdenticonGeneration: { + type: "boolean", + optional: false, + nullable: false, + }, }, }, } as const; @@ -595,5 +602,7 @@ export default define(meta, paramDef, async (ps, me) => { enableIpLogging: instance.enableIpLogging, enableActiveEmailValidation: instance.enableActiveEmailValidation, experimentalFeatures: instance.experimentalFeatures, + enableServerMachineStats: instance.enableServerMachineStats, + enableIdenticonGeneration: instance.enableIdenticonGeneration, }; }); diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index 347ebb9cda..7a2bf23651 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -42,6 +42,7 @@ export default define(meta, paramDef, async (ps, me) => { isModerator: user.isModerator, isSilenced: user.isSilenced, isSuspended: user.isSuspended, + moderationNote: profile.moderationNote, }; } diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index b967112a5c..cf22c6c489 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -174,7 +174,6 @@ export const paramDef = { type: "object", nullable: true, properties: { - postEditing: { type: "boolean" }, postImports: { type: "boolean" }, }, }, diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts index fa804802eb..3dd168d718 100644 --- a/packages/backend/src/server/api/endpoints/ap/show.ts +++ b/packages/backend/src/server/api/endpoints/ap/show.ts @@ -1,5 +1,4 @@ import define from "../../define.js"; -import config from "@/config/index.js"; import { createPerson } from "@/remote/activitypub/models/person.js"; import { createNote } from "@/remote/activitypub/models/note.js"; import DbResolver from "@/remote/activitypub/db-resolver.js"; @@ -9,11 +8,13 @@ import { extractDbHost } from "@/misc/convert-host.js"; import { Users, Notes } from "@/models/index.js"; import type { Note } from "@/models/entities/note.js"; import type { CacheableLocalUser, User } from "@/models/entities/user.js"; -import { fetchMeta } from "@/misc/fetch-meta.js"; import { isActor, isPost, getApId } from "@/remote/activitypub/type.js"; import type { SchemaType } from "@/misc/schema.js"; import { HOUR } from "@/const.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js"; +import { updateQuestion } from "@/remote/activitypub/models/question.js"; +import { populatePoll } from "@/models/repositories/note.js"; +import { redisClient } from "@/db/redis.js"; export const meta = { tags: ["federation"], @@ -104,18 +105,30 @@ async function fetchAny( const dbResolver = new DbResolver(); - let local = await mergePack( - me, - ...(await Promise.all([ - dbResolver.getUserFromApId(uri), - dbResolver.getNoteFromApId(uri), - ])), - ); - if (local != null) return local; + const [user, note] = await Promise.all([ + dbResolver.getUserFromApId(uri), + dbResolver.getNoteFromApId(uri), + ]); + let local = await mergePack(me, user, note); + if (local) { + if (local.type === "Note" && note?.uri && note.hasPoll) { + // Update questions if the stored (remote) note contains the poll + const key = `pollFetched:${note.uri}`; + if ((await redisClient.exists(key)) === 0) { + if (await updateQuestion(note.uri)) { + local.object.poll = await populatePoll(note, me?.id ?? null); + } + // Allow fetching the poll again after 1 minute + await redisClient.set(key, 1, "EX", 60); + } + } + return local; + } // fetching Object once from remote const resolver = new Resolver(); - const object = (await resolver.resolve(uri)) as any; + resolver.setUser(me); + const object = await resolver.resolve(uri); // /@user If a URI other than the id is specified, // the URI is determined here @@ -123,8 +136,8 @@ async function fetchAny( local = await mergePack( me, ...(await Promise.all([ - dbResolver.getUserFromApId(object.id), - dbResolver.getNoteFromApId(object.id), + dbResolver.getUserFromApId(getApId(object)), + dbResolver.getNoteFromApId(getApId(object)), ])), ); if (local != null) return local; @@ -132,8 +145,12 @@ async function fetchAny( return await mergePack( me, - isActor(object) ? await createPerson(getApId(object)) : null, - isPost(object) ? await createNote(getApId(object), undefined, true) : null, + isActor(object) + ? await createPerson(getApId(object), resolver.reset()) + : null, + isPost(object) + ? await createNote(getApId(object), resolver.reset(), true) + : null, ); } diff --git a/packages/backend/src/server/api/endpoints/compatibility/peers.ts b/packages/backend/src/server/api/endpoints/compatibility/peers.ts new file mode 100644 index 0000000000..30f6e0e937 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/compatibility/peers.ts @@ -0,0 +1,25 @@ +import { Instances } from "@/models/index.js"; +import define from "../../define.js"; + +export const meta = { + tags: ["meta"], + requireCredential: false, + requireCredentialPrivateMode: true, + allowGet: true, + cacheSec: 60, +} as const; + +export const paramDef = { + type: "object", +} as const; + +export default define(meta, paramDef, async (ps) => { + const instances = await Instances.find({ + select: ["host"], + where: { + isSuspended: false, + }, + }); + + return instances.map((instance) => instance.host); +}); diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts index f6c978b2de..673a0266c8 100644 --- a/packages/backend/src/server/api/endpoints/meta.ts +++ b/packages/backend/src/server/api/endpoints/meta.ts @@ -529,7 +529,7 @@ export default define(meta, paramDef, async (ps, me) => { github: instance.enableGithubIntegration, discord: instance.enableDiscordIntegration, serviceWorker: instance.enableServiceWorker, - postEditing: instance.experimentalFeatures?.postEditing || false, + postEditing: true, postImports: instance.experimentalFeatures?.postImports || false, miauth: true, }; diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 28cfff6020..70c5ceffb4 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -33,6 +33,7 @@ import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import renderNote from "@/remote/activitypub/renderer/note.js"; import renderUpdate from "@/remote/activitypub/renderer/update.js"; import { deliverToRelays } from "@/services/relay.js"; +// import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { @@ -139,12 +140,6 @@ export const meta = { code: "NOT_LOCAL_USER", id: "b907f407-2aa0-4283-800b-a2c56290b822", }, - - editsDisabled: { - message: "Post edits are disabled.", - code: "EDITS_DISABLED", - id: "99306f00-fb81-11ed-be56-0242ac120002", - }, }, } as const; @@ -243,11 +238,6 @@ export const paramDef = { export default define(meta, paramDef, async (ps, user) => { if (user.movedToUri != null) throw new ApiError(meta.errors.accountLocked); - const instanceMeta = await fetchMeta(); - if (instanceMeta.experimentalFeatures?.postEdits === false) { - throw new ApiError(meta.errors.editsDisabled); - } - if (!Users.isLocalUser(user)) { throw new ApiError(meta.errors.notLocalUser); } @@ -476,14 +466,20 @@ export default define(meta, paramDef, async (ps, user) => { if (poll.noteVisibility !== ps.visibility) { pollUpdate.noteVisibility = ps.visibility; } - // We can't do an unordered equal check because the order of choices - // is important and if it changes, we need to reset the votes. - if (JSON.stringify(poll.choices) !== JSON.stringify(pp.choices)) { - pollUpdate.choices = pp.choices; - pollUpdate.votes = new Array(pp.choices.length).fill(0); + // Keep votes for unmodified choices, reset votes if choice is modified or new + const oldVoteCounts = new Map<string, number>(); + for (let i = 0; i < poll.choices.length; i++) { + oldVoteCounts.set(poll.choices[i], poll.votes[i]); } + const newVotes = pp.choices.map( + (choice) => oldVoteCounts.get(choice) || 0, + ); + pollUpdate.choices = pp.choices; + pollUpdate.votes = newVotes; if (notEmpty(pollUpdate)) { await Polls.update(note.id, pollUpdate); + // Seemingly already handled by by the rendered update activity + // await deliverQuestionUpdate(note.id); } publishing = true; } @@ -520,9 +516,12 @@ export default define(meta, paramDef, async (ps, user) => { if (ps.text !== note.text) { update.text = ps.text; } - if (ps.cw !== note.cw) { + if (ps.cw !== note.cw || (ps.cw && !note.cw)) { update.cw = ps.cw; } + if (!ps.cw && note.cw) { + update.cw = null; + } if (ps.visibility !== note.visibility) { update.visibility = ps.visibility; } @@ -593,7 +592,7 @@ export default define(meta, paramDef, async (ps, user) => { } if (publishing) { - index(note); + index(note, true); // Publish update event for the updated note details publishNoteStream(note.id, "updated", { diff --git a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts index 0558aa1b8f..40535d3401 100644 --- a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts +++ b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts @@ -4,7 +4,6 @@ import { createNotification } from "@/services/create-notification.js"; import { deliver } from "@/queue/index.js"; import { renderActivity } from "@/remote/activitypub/renderer/index.js"; import renderVote from "@/remote/activitypub/renderer/vote.js"; -import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { PollVotes, NoteWatchings, @@ -178,7 +177,4 @@ export default define(meta, paramDef, async (ps, user) => { pollOwner.inbox, ); } - - // リモートフォロワーにUpdate配信 - deliverQuestionUpdate(note.id); }); diff --git a/packages/backend/src/server/api/endpoints/patrons.ts b/packages/backend/src/server/api/endpoints/patrons.ts index 944858694a..be89c571fb 100644 --- a/packages/backend/src/server/api/endpoints/patrons.ts +++ b/packages/backend/src/server/api/endpoints/patrons.ts @@ -11,19 +11,32 @@ export const meta = { export const paramDef = { type: "object", - properties: {}, + properties: { + forceUpdate: { type: "boolean", default: false }, + }, required: [], } as const; -export default define(meta, paramDef, async () => { +export default define(meta, paramDef, async (ps) => { let patrons; const cachedPatrons = await redisClient.get("patrons"); - if (cachedPatrons) { + if (!ps.forceUpdate && cachedPatrons) { patrons = JSON.parse(cachedPatrons); } else { + AbortSignal.timeout ??= function timeout(ms) { + const ctrl = new AbortController(); + setTimeout(() => ctrl.abort(), ms); + return ctrl.signal; + }; + patrons = await fetch( "https://codeberg.org/calckey/calckey/raw/branch/develop/patrons.json", - ).then((response) => response.json()); + { signal: AbortSignal.timeout(2000) }, + ) + .then((response) => response.json()) + .catch(() => { + patrons = cachedPatrons ? JSON.parse(cachedPatrons) : []; + }); await redisClient.set("patrons", JSON.stringify(patrons), "EX", 3600); } diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts index cc9aa91b2a..87132758fe 100644 --- a/packages/backend/src/server/api/endpoints/server-info.ts +++ b/packages/backend/src/server/api/endpoints/server-info.ts @@ -1,12 +1,14 @@ import * as os from "node:os"; import si from "systeminformation"; import define from "../define.js"; -import meilisearch from "../../../db/meilisearch.js"; +import meilisearch from "@/db/meilisearch.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { requireCredential: false, requireCredentialPrivateMode: true, - + allowGet: true, + cacheSec: 30, tags: ["meta"], } as const; @@ -19,8 +21,33 @@ export const paramDef = { export default define(meta, paramDef, async () => { const memStats = await si.mem(); const fsStats = await si.fsSize(); - const meilisearchStats = await meilisearchStatus(); + let fsIndex = 0; + // Get the first index of fs sizes that are actualy used. + for (const [i, stat] of fsStats.entries()) { + if (stat.rw === true && stat.used > 0) { + fsIndex = i; + break; + } + } + + const instanceMeta = await fetchMeta(); + if (!instanceMeta.enableServerMachineStats) { + return { + machine: "Not specified", + cpu: { + model: "Not specified", + cores: 0, + }, + mem: { + total: 0, + }, + fs: { + total: 0, + used: 0, + }, + }; + } return { machine: os.hostname(), cpu: { @@ -31,8 +58,8 @@ export default define(meta, paramDef, async () => { total: memStats.total, }, fs: { - total: fsStats[0].size, - used: fsStats[0].used, + total: fsStats[fsIndex].size, + used: fsStats[fsIndex].used, }, }; }); diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts index eeccf69386..f34083233f 100644 --- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts +++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts @@ -32,6 +32,12 @@ export const paramDef = { username: { type: "string", nullable: true }, host: { type: "string", nullable: true }, limit: { type: "integer", minimum: 1, maximum: 100, default: 10 }, + maxDaysSinceLastActive: { + type: "integer", + minimum: 1, + maximum: 1000, + default: 30, + }, detail: { type: "boolean", default: true }, }, anyOf: [{ required: ["username"] }, { required: ["host"] }], @@ -40,7 +46,9 @@ export const paramDef = { // TODO: avatar,bannerをJOINしたいけどエラーになる export default define(meta, paramDef, async (ps, me) => { - const activeThreshold = new Date(Date.now() - 1000 * 60 * 60 * 24 * 30); // 30日 + const activeThreshold = ps.maxDaysSinceLastActive + ? new Date(Date.now() - 1000 * 60 * 60 * 24 * ps.maxDaysSinceLastActive) + : null; if (ps.host) { const q = Users.createQueryBuilder("user") @@ -75,8 +83,10 @@ export default define(meta, paramDef, async (ps, me) => { .andWhere("user.isSuspended = FALSE") .andWhere("user.usernameLower LIKE :username", { username: `${sqlLikeEscape(ps.username.toLowerCase())}%`, - }) - .andWhere( + }); + + if (activeThreshold) { + query.andWhere( new Brackets((qb) => { qb.where("user.updatedAt IS NULL").orWhere( "user.updatedAt > :activeThreshold", @@ -84,6 +94,7 @@ export default define(meta, paramDef, async (ps, me) => { ); }), ); + } query.setParameters(followingQuery.getParameters()); diff --git a/packages/backend/src/server/api/index.ts b/packages/backend/src/server/api/index.ts index 3568a27b25..29cfbf93c0 100644 --- a/packages/backend/src/server/api/index.ts +++ b/packages/backend/src/server/api/index.ts @@ -87,7 +87,7 @@ mastoFileRouter.post("/v1/media", upload.single("file"), async (ctx) => { const accessTokens = ctx.headers.authorization; const client = getClient(BASE_URL, accessTokens); try { - let multipartData = await ctx.file; + const multipartData = await ctx.file; if (!multipartData) { ctx.body = { error: "No image" }; ctx.status = 401; @@ -106,7 +106,7 @@ mastoFileRouter.post("/v2/media", upload.single("file"), async (ctx) => { const accessTokens = ctx.headers.authorization; const client = getClient(BASE_URL, accessTokens); try { - let multipartData = await ctx.file; + const multipartData = await ctx.file; if (!multipartData) { ctx.body = { error: "No image" }; ctx.status = 401; @@ -185,17 +185,6 @@ router.use(discord.routes()); router.use(github.routes()); router.use(twitter.routes()); -router.get("/v1/instance/peers", async (ctx) => { - const instances = await Instances.find({ - select: ["host"], - where: { - isSuspended: false, - }, - }); - - ctx.body = instances.map((instance) => instance.host); -}); - router.post("/miauth/:session/check", async (ctx) => { const token = await AccessTokens.findOneBy({ session: ctx.params.session, diff --git a/packages/backend/src/server/api/limiter.ts b/packages/backend/src/server/api/limiter.ts index dd005ad136..367fb3d279 100644 --- a/packages/backend/src/server/api/limiter.ts +++ b/packages/backend/src/server/api/limiter.ts @@ -3,6 +3,7 @@ import { CacheableLocalUser, User } from "@/models/entities/user.js"; import Logger from "@/services/logger.js"; import { redisClient } from "../../db/redis.js"; import type { IEndpointMeta } from "./endpoints.js"; +import { convertMilliseconds } from "@/misc/convert-milliseconds.js"; const logger = new Logger("limiter"); @@ -76,7 +77,10 @@ export const limiter = ( ); if (info.remaining === 0) { - reject("RATE_LIMIT_EXCEEDED"); + reject({ + message: "RATE_LIMIT_EXCEEDED", + remainingTime: convertMilliseconds(info.resetMs - Date.now()), + }); } else { ok(); } diff --git a/packages/backend/src/server/api/mastodon/endpoints/meta.ts b/packages/backend/src/server/api/mastodon/endpoints/meta.ts index d362d1b9e5..c68a09585f 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/meta.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/meta.ts @@ -12,7 +12,7 @@ export async function getInstance(response: Entity.Instance) { uri: response.uri, title: response.title || "Calckey", short_description: - response.description.substring(0, 50) || "See real server website", + response.description?.substring(0, 50) || "See real server website", description: response.description || "This is a vanilla Calckey Instance. It doesnt seem to have a description. BTW you are using the Mastodon api to access this server :)", diff --git a/packages/backend/src/server/api/openapi/errors.ts b/packages/backend/src/server/api/openapi/errors.ts index 0fe229d88e..9e7c77c0f2 100644 --- a/packages/backend/src/server/api/openapi/errors.ts +++ b/packages/backend/src/server/api/openapi/errors.ts @@ -3,7 +3,7 @@ export const errors = { INVALID_PARAM: { value: { error: { - message: "Invalid param.", + message: "Invalid parameter.", code: "INVALID_PARAM", id: "3d81ceae-475f-4600-b2a8-2bc116157532", }, @@ -25,8 +25,7 @@ export const errors = { AUTHENTICATION_FAILED: { value: { error: { - message: - "Authentication failed. Please ensure your token is correct.", + message: "Authentication failed.", code: "AUTHENTICATION_FAILED", id: "b0a7f5f8-dc2f-4171-b91f-de88ad238e14", }, @@ -38,7 +37,7 @@ export const errors = { value: { error: { message: - "You sent a request to Calc, Calckey's resident stoner furry, instead of the server.", + "You sent a request to Calc instead of the server. How did this happen?", code: "I_AM_CALC", id: "60c46cd1-f23a-46b1-bebe-5d2b73951a84", }, diff --git a/packages/backend/src/server/api/openapi/gen-spec.ts b/packages/backend/src/server/api/openapi/gen-spec.ts index dfaacf9e50..683ffc6223 100644 --- a/packages/backend/src/server/api/openapi/gen-spec.ts +++ b/packages/backend/src/server/api/openapi/gen-spec.ts @@ -182,7 +182,7 @@ export function genOpenapiSpec() { ...(endpoint.meta.limit ? { "429": { - description: "To many requests", + description: "Too many requests", content: { "application/json": { schema: { diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 95d570eb3d..cd2d132199 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -16,6 +16,7 @@ import { IsNull } from "typeorm"; import config from "@/config/index.js"; import Logger from "@/services/logger.js"; import { UserProfiles, Users } from "@/models/index.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import { genIdenticon } from "@/misc/gen-identicon.js"; import { createTemp } from "@/misc/create-temp.js"; import { publishMainStream } from "@/services/stream.js"; @@ -125,10 +126,15 @@ router.get("/avatar/@:acct", async (ctx) => { }); router.get("/identicon/:x", async (ctx) => { - const [temp, cleanup] = await createTemp(); - await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); - ctx.set("Content-Type", "image/png"); - ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + const meta = await fetchMeta(); + if (meta.enableIdenticonGeneration) { + const [temp, cleanup] = await createTemp(); + await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); + ctx.set("Content-Type", "image/png"); + ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + } else { + ctx.redirect("/static-assets/avatar.png"); + } }); mastoRouter.get("/oauth/authorize", async (ctx) => { diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts index 18e04f4209..940ca2e135 100644 --- a/packages/backend/src/server/nodeinfo.ts +++ b/packages/backend/src/server/nodeinfo.ts @@ -83,7 +83,7 @@ const nodeinfo2 = async () => { disableGlobalTimeline: meta.disableGlobalTimeline, emailRequiredForSignup: meta.emailRequiredForSignup, searchFilters: config.meilisearch ? true : false, - postEditing: meta.experimentalFeatures?.postEditing || false, + postEditing: true, postImports: meta.experimentalFeatures?.postImports || false, enableHcaptcha: meta.enableHcaptcha, enableRecaptcha: meta.enableRecaptcha, @@ -100,7 +100,10 @@ const nodeinfo2 = async () => { }; }; -const cache = new Cache<Awaited<ReturnType<typeof nodeinfo2>>>(1000 * 60 * 10); +const cache = new Cache<Awaited<ReturnType<typeof nodeinfo2>>>( + "nodeinfo", + 60 * 10, +); router.get(nodeinfo2_1path, async (ctx) => { const base = await cache.fetch(null, () => nodeinfo2()); diff --git a/packages/backend/src/server/web/feed.ts b/packages/backend/src/server/web/feed.ts index 9cbeb28ae1..004745901d 100644 --- a/packages/backend/src/server/web/feed.ts +++ b/packages/backend/src/server/web/feed.ts @@ -4,22 +4,39 @@ import config from "@/config/index.js"; import type { User } from "@/models/entities/user.js"; import { Notes, DriveFiles, UserProfiles, Users } from "@/models/index.js"; -export default async function (user: User) { +export default async function ( + user: User, + threadDepth = 5, + history = 20, + noteintitle = false, + renotes = true, + replies = true, +) { const author = { link: `${config.url}/@${user.username}`, + email: `${user.username}@${config.host}`, name: user.name || user.username, }; const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); + const searchCriteria = { + userId: user.id, + visibility: In(["public", "home"]), + }; + + if (!renotes) { + searchCriteria.renoteId = IsNull(); + } + + if (!replies) { + searchCriteria.replyId = IsNull(); + } + const notes = await Notes.find({ - where: { - userId: user.id, - renoteId: IsNull(), - visibility: In(["public", "home"]), - }, + where: searchCriteria, order: { createdAt: -1 }, - take: 20, + take: history, }); const feed = new Feed({ @@ -43,22 +60,105 @@ export default async function (user: User) { }); for (const note of notes) { + let contentStr = await noteToString(note, true); + let next = note.renoteId ? note.renoteId : note.replyId; + let depth = threadDepth; + while (depth > 0 && next) { + const finding = await findById(next); + contentStr += finding.text; + next = finding.next; + depth -= 1; + } + + let title = `${author.name} `; + if (note.renoteId) { + title += "renotes"; + } else if (note.replyId) { + title += "replies"; + } else { + title += "says"; + } + if (noteintitle) { + const content = note.cw ?? note.text; + if (content) { + title += `: ${content}`; + } else { + title += "something"; + } + } + + feed.addItem({ + title: title + .replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, "") + .substring(0, 100), + link: `${config.url}/notes/${note.id}`, + date: note.createdAt, + description: note.cw + ? note.cw.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, "") + : undefined, + content: contentStr.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, ""), + }); + } + + async function noteToString(note, isTheNote = false) { + const author = isTheNote + ? null + : await Users.findOneBy({ id: note.userId }); + let outstr = author + ? `${author.name}(@${author.username}@${ + author.host ? author.host : config.host + }) ${ + note.renoteId ? "renotes" : note.replyId ? "replies" : "says" + }: <br>` + : ""; const files = note.fileIds.length > 0 ? await DriveFiles.findBy({ id: In(note.fileIds), }) : []; - const file = files.find((file) => file.type.startsWith("image/")); + let fileEle = ""; + for (const file of files) { + if (file.type.startsWith("image/")) { + fileEle += ` <br><img src="${DriveFiles.getPublicUrl(file)}">`; + } else if (file.type.startsWith("audio/")) { + fileEle += ` <br><audio controls src="${DriveFiles.getPublicUrl( + file, + )}" type="${file.type}">`; + } else if (file.type.startsWith("video/")) { + fileEle += ` <br><video controls src="${DriveFiles.getPublicUrl( + file, + )}" type="${file.type}">`; + } else { + fileEle += ` <br><a href="${DriveFiles.getPublicUrl(file)}" download="${ + file.name + }">${file.name}</a>`; + } + } + outstr += `${note.cw ? note.cw + "<br>" : ""}${note.text || ""}${fileEle}`; + if (isTheNote) { + outstr += ` <span class="${ + note.renoteId ? "renote_note" : note.replyId ? "reply_note" : "new_note" + } ${ + fileEle.indexOf("img src") !== -1 ? "with_img" : "without_img" + }"></span>`; + } + return outstr; + } - feed.addItem({ - title: `New note by ${author.name}`, - link: `${config.url}/notes/${note.id}`, - date: note.createdAt, - description: note.cw || undefined, - content: note.text || undefined, - image: file ? DriveFiles.getPublicUrl(file) || undefined : undefined, + async function findById(id) { + let text = ""; + let next = null; + const findings = await Notes.findOneBy({ + id: id, + visibility: In(["public", "home"]), }); + if (findings) { + text += `<hr>`; + text += await noteToString(findings); + next = findings.renoteId ? findings.renoteId : findings.replyId; + } + return { text, next }; } return feed; diff --git a/packages/backend/src/server/web/index.ts b/packages/backend/src/server/web/index.ts index 9f8b32ad89..070031a919 100644 --- a/packages/backend/src/server/web/index.ts +++ b/packages/backend/src/server/web/index.ts @@ -247,7 +247,14 @@ router.get("/api.json", async (ctx) => { ctx.body = genOpenapiSpec(); }); -const getFeed = async (acct: string) => { +const getFeed = async ( + acct: string, + threadDepth: string, + historyCount: string, + noteInTitle: string, + noRenotes: string, + noReplies: string, +) => { const meta = await fetchMeta(); if (meta.privateMode) { return; @@ -257,14 +264,36 @@ const getFeed = async (acct: string) => { usernameLower: username.toLowerCase(), host: host ?? IsNull(), isSuspended: false, + isLocked: false, }); - - return user && (await packFeed(user)); + if (!user) { + return; + } + let thread = parseInt(threadDepth, 10); + if (isNaN(thread) || thread < 0 || thread > 30) { + thread = 3; + } + let history = parseInt(historyCount, 10); + //cant be 0 here or it will get all posts + if (isNaN(history) || history <= 0 || history > 30) { + history = 20; + } + return ( + user && + (await packFeed( + user, + thread, + history, + !isNaN(noteInTitle), + isNaN(noRenotes), + isNaN(noReplies), + )) + ); }; // As the /@user[.json|.rss|.atom]/sub endpoint is complicated, we will use a regex to switch between them. const reUser = new RegExp( - "^/@(?<user>[^/]+?)(?:.(?<feed>json|rss|atom))?(?:/(?<sub>[^/]+))?$", + "^/@(?<user>[^/]+?)(?:.(?<feed>json|rss|atom)(?:\\?[^/]*)?)?(?:/(?<sub>[^/]+))?$", ); router.get(reUser, async (ctx, next) => { const groups = reUser.exec(ctx.originalUrl)?.groups; @@ -275,7 +304,7 @@ router.get(reUser, async (ctx, next) => { ctx.params = groups; - console.log(ctx, ctx.params); + //console.log(ctx, ctx.params, ctx.query); if (groups.feed) { if (groups.sub) { await next(); @@ -301,7 +330,14 @@ router.get(reUser, async (ctx, next) => { // Atom const atomFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user); + const feed = await getFeed( + ctx.params.user, + ctx.query.thread, + ctx.query.history, + ctx.query.noteintitle, + ctx.query.norenotes, + ctx.query.noreplies, + ); if (feed) { ctx.set("Content-Type", "application/atom+xml; charset=utf-8"); @@ -313,7 +349,14 @@ const atomFeed: Router.Middleware = async (ctx) => { // RSS const rssFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user); + const feed = await getFeed( + ctx.params.user, + ctx.query.thread, + ctx.query.history, + ctx.query.noteintitle, + ctx.query.norenotes, + ctx.query.noreplies, + ); if (feed) { ctx.set("Content-Type", "application/rss+xml; charset=utf-8"); @@ -325,7 +368,14 @@ const rssFeed: Router.Middleware = async (ctx) => { // JSON const jsonFeed: Router.Middleware = async (ctx) => { - const feed = await getFeed(ctx.params.user); + const feed = await getFeed( + ctx.params.user, + ctx.query.thread, + ctx.query.history, + ctx.query.noteintitle, + ctx.query.norenotes, + ctx.query.noreplies, + ); if (feed) { ctx.set("Content-Type", "application/json; charset=utf-8"); diff --git a/packages/backend/src/server/web/style.css b/packages/backend/src/server/web/style.css index 5072e0ad4e..9b2ee2d9cc 100644 --- a/packages/backend/src/server/web/style.css +++ b/packages/backend/src/server/web/style.css @@ -2,6 +2,12 @@ html { background-color: var(--bg); color: var(--fg); } +@media (prefers-color-scheme: dark) { + html { + --bg: rgb(17, 17, 27); + --fg: rgb(224, 222, 244); + } +} #splash { position: fixed; diff --git a/packages/backend/src/services/chart/charts/active-users.ts b/packages/backend/src/services/chart/charts/active-users.ts index 7a0c45cfaf..322bfd25bc 100644 --- a/packages/backend/src/services/chart/charts/active-users.ts +++ b/packages/backend/src/services/chart/charts/active-users.ts @@ -25,12 +25,12 @@ export default class ActiveUsersChart extends Chart<typeof schema> { return {}; } - public async read(user: { + public read(user: { id: User["id"]; host: null; createdAt: User["createdAt"]; - }): Promise<void> { - await this.commit({ + }) { + this.commit({ read: [user.id], registeredWithinWeek: Date.now() - user.createdAt.getTime() < week ? [user.id] : [], diff --git a/packages/backend/src/services/drive/add-file.ts b/packages/backend/src/services/drive/add-file.ts index b25375b947..b9991f4949 100644 --- a/packages/backend/src/services/drive/add-file.ts +++ b/packages/backend/src/services/drive/add-file.ts @@ -368,7 +368,7 @@ async function upload( ); } -async function deleteOldFile(user: IRemoteUser) { +async function expireOldFile(user: IRemoteUser, driveCapacity: number) { const q = DriveFiles.createQueryBuilder("file") .where("file.userId = :userId", { userId: user.id }) .andWhere("file.isLink = FALSE"); @@ -381,12 +381,22 @@ async function deleteOldFile(user: IRemoteUser) { q.andWhere("file.id != :bannerId", { bannerId: user.bannerId }); } + //This selete is hard coded, be careful if change database schema + q.addSelect( + 'SUM("file"."size") OVER (ORDER BY "file"."id" DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)', + "acc_usage", + ); + q.orderBy("file.id", "ASC"); - const oldFile = await q.getOne(); + const fileList = await q.getRawMany(); + const exceedFileIds = fileList + .filter((x: any) => x.acc_usage > driveCapacity) + .map((x: any) => x.file_id); - if (oldFile) { - deleteFile(oldFile, true); + for (const fileId of exceedFileIds) { + const file = await DriveFiles.findOneBy({ id: fileId }); + deleteFile(file, true); } } @@ -529,8 +539,9 @@ export async function addFile({ ); } else { // (アバターまたはバナーを含まず)最も古いファイルを削除する - deleteOldFile( + expireOldFile( (await Users.findOneByOrFail({ id: user.id })) as IRemoteUser, + driveCapacity - info.size, ); } } diff --git a/packages/backend/src/services/instance-actor.ts b/packages/backend/src/services/instance-actor.ts index 50ce227eba..a8b34ea57b 100644 --- a/packages/backend/src/services/instance-actor.ts +++ b/packages/backend/src/services/instance-actor.ts @@ -6,10 +6,10 @@ import { IsNull } from "typeorm"; const ACTOR_USERNAME = "instance.actor" as const; -const cache = new Cache<ILocalUser>(Infinity); +const cache = new Cache<ILocalUser>("instanceActor", 60 * 30); export async function getInstanceActor(): Promise<ILocalUser> { - const cached = cache.get(null); + const cached = await cache.get(null, true); if (cached) return cached; const user = (await Users.findOneBy({ @@ -18,11 +18,11 @@ export async function getInstanceActor(): Promise<ILocalUser> { })) as ILocalUser | undefined; if (user) { - cache.set(null, user); + await cache.set(null, user); return user; } else { const created = (await createSystemUser(ACTOR_USERNAME)) as ILocalUser; - cache.set(null, created); + await cache.set(null, created); return created; } } diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index ab3f365705..095c75f427 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -29,17 +29,14 @@ import { Notes, Instances, UserProfiles, - Antennas, - Followings, MutedNotes, Channels, ChannelFollowings, - Blockings, NoteThreadMutings, } from "@/models/index.js"; import type { DriveFile } from "@/models/entities/drive-file.js"; import type { App } from "@/models/entities/app.js"; -import { Not, In, IsNull } from "typeorm"; +import { Not, In } from "typeorm"; import type { User, ILocalUser, IRemoteUser } from "@/models/entities/user.js"; import { genId } from "@/misc/gen-id.js"; import { @@ -56,7 +53,7 @@ import { checkHitAntenna } from "@/misc/check-hit-antenna.js"; import { getWordHardMute } from "@/misc/check-word-mute.js"; import { addNoteToAntenna } from "../add-note-to-antenna.js"; import { countSameRenotes } from "@/misc/count-same-renotes.js"; -import { deliverToRelays } from "../relay.js"; +import { deliverToRelays, getCachedRelays } from "../relay.js"; import type { Channel } from "@/models/entities/channel.js"; import { normalizeForSearch } from "@/misc/normalize-for-search.js"; import { getAntennas } from "@/misc/antenna-cache.js"; @@ -68,10 +65,12 @@ import { db } from "@/db/postgre.js"; import { getActiveWebhooks } from "@/misc/webhook-cache.js"; import { shouldSilenceInstance } from "@/misc/should-block-instance.js"; import meilisearch from "../../db/meilisearch.js"; +import { redisClient } from "@/db/redis.js"; +import { Mutex } from "redis-semaphore"; const mutedWordsCache = new Cache< { userId: UserProfile["userId"]; mutedWords: UserProfile["mutedWords"] }[] ->(1000 * 60 * 5); +>("mutedWords", 60 * 5); type NotificationType = "reply" | "renote" | "quote" | "mention"; @@ -165,6 +164,7 @@ export default async ( isSilenced: User["isSilenced"]; createdAt: User["createdAt"]; isBot: User["isBot"]; + inbox?: User["inbox"]; }, data: Option, silent = false, @@ -194,7 +194,13 @@ export default async ( data.channel = await Channels.findOneBy({ id: data.reply.channelId }); } - if (data.createdAt == null) data.createdAt = new Date(); + const now = new Date(); + if ( + !data.createdAt || + isNaN(data.createdAt.getTime()) || + data.createdAt > now + ) + data.createdAt = now; if (data.visibility == null) data.visibility = "public"; if (data.localOnly == null) data.localOnly = false; if (data.channel != null) data.visibility = "public"; @@ -453,7 +459,44 @@ export default async ( } if (!dontFederateInitially) { - publishNotesStream(note); + let publishKey: string; + let noteToPublish: Note; + const relays = await getCachedRelays(); + + // Some relays (e.g., aode-relay) deliver posts by boosting them as + // Announce activities. In that case, user is the relay's actor. + const boostedByRelay = + !!user.inbox && + relays.map((relay) => relay.inbox).includes(user.inbox); + + if (boostedByRelay && data.renote && data.renote.userHost) { + publishKey = `publishedNote:${data.renote.id}`; + noteToPublish = data.renote; + } else { + publishKey = `publishedNote:${note.id}`; + noteToPublish = note; + } + + const lock = new Mutex(redisClient, "publishedNote"); + await lock.acquire(); + try { + const published = (await redisClient.get(publishKey)) !== null; + if (!published) { + await redisClient.set(publishKey, "done", "EX", 30); + if (noteToPublish.renoteId) { + // Prevents other threads from publishing the boosting post + await redisClient.set( + `publishedNote:${noteToPublish.renoteId}`, + "done", + "EX", + 30, + ); + } + publishNotesStream(noteToPublish); + } + } finally { + await lock.release(); + } } if (note.replyId != null) { // Only provide the reply note id here as the recipient may not be authorized to see the note. @@ -524,7 +567,6 @@ export default async ( nm.push(data.renote.userId, type); } } - // Fetch watchers nmRelatedPromises.push( notifyToWatchersOfRenotee(data.renote, user, nm, type), @@ -537,8 +579,9 @@ export default async ( }); publishMainStream(data.renote.userId, "renote", packedRenote); + const renote = data.renote; const webhooks = (await getActiveWebhooks()).filter( - (x) => x.userId === data.renote!.userId && x.on.includes("renote"), + (x) => x.userId === renote.userId && x.on.includes("renote"), ); for (const webhook of webhooks) { webhookDeliver(webhook, "renote", { diff --git a/packages/backend/src/services/register-or-fetch-instance-doc.ts b/packages/backend/src/services/register-or-fetch-instance-doc.ts index 4c3570e907..c0ead08190 100644 --- a/packages/backend/src/services/register-or-fetch-instance-doc.ts +++ b/packages/backend/src/services/register-or-fetch-instance-doc.ts @@ -4,30 +4,30 @@ import { genId } from "@/misc/gen-id.js"; import { toPuny } from "@/misc/convert-host.js"; import { Cache } from "@/misc/cache.js"; -const cache = new Cache<Instance>(1000 * 60 * 60); +const cache = new Cache<Instance>("registerOrFetchInstanceDoc", 60 * 60); export async function registerOrFetchInstanceDoc( host: string, ): Promise<Instance> { - host = toPuny(host); + const _host = toPuny(host); - const cached = cache.get(host); + const cached = await cache.get(_host); if (cached) return cached; - const index = await Instances.findOneBy({ host }); + const index = await Instances.findOneBy({ host: _host }); if (index == null) { const i = await Instances.insert({ id: genId(), - host, + host: _host, caughtAt: new Date(), lastCommunicatedAt: new Date(), }).then((x) => Instances.findOneByOrFail(x.identifiers[0])); - cache.set(host, i); + await cache.set(_host, i); return i; } else { - cache.set(host, index); + await cache.set(_host, index); return index; } } diff --git a/packages/backend/src/services/relay.ts b/packages/backend/src/services/relay.ts index 244e05c030..6f7829c218 100644 --- a/packages/backend/src/services/relay.ts +++ b/packages/backend/src/services/relay.ts @@ -15,7 +15,7 @@ import { createSystemUser } from "./create-system-user.js"; const ACTOR_USERNAME = "relay.actor" as const; -const relaysCache = new Cache<Relay[]>(1000 * 60 * 10); +const relaysCache = new Cache<Relay[]>("relay", 60 * 10); export async function getRelayActor(): Promise<ILocalUser> { const user = await Users.findOneBy({ @@ -37,7 +37,7 @@ export async function addRelay(inbox: string) { }).then((x) => Relays.findOneByOrFail(x.identifiers[0])); const relayActor = await getRelayActor(); - const follow = await renderFollowRelay(relay, relayActor); + const follow = renderFollowRelay(relay, relayActor); const activity = renderActivity(follow); deliver(relayActor, activity, relay.inbox); @@ -60,6 +60,7 @@ export async function removeRelay(inbox: string) { deliver(relayActor, activity, relay.inbox); await Relays.delete(relay.id); + await updateRelaysCache(); } export async function listRelay() { @@ -67,14 +68,31 @@ export async function listRelay() { return relays; } +export async function getCachedRelays(): Promise<Relay[]> { + return await relaysCache.fetch(null, () => + Relays.findBy({ + status: "accepted", + }), + ); +} + export async function relayAccepted(id: string) { const result = await Relays.update(id, { status: "accepted", }); + await updateRelaysCache(); + return JSON.stringify(result); } +async function updateRelaysCache() { + const relays = await Relays.findBy({ + status: "accepted", + }); + await relaysCache.set(null, relays); +} + export async function relayRejected(id: string) { const result = await Relays.update(id, { status: "rejected", @@ -89,11 +107,7 @@ export async function deliverToRelays( ) { if (activity == null) return; - const relays = await relaysCache.fetch(null, () => - Relays.findBy({ - status: "accepted", - }), - ); + const relays = await getCachedRelays(); if (relays.length === 0) return; // TODO diff --git a/packages/backend/src/services/user-cache.ts b/packages/backend/src/services/user-cache.ts index 9492448554..ed700185df 100644 --- a/packages/backend/src/services/user-cache.ts +++ b/packages/backend/src/services/user-cache.ts @@ -3,17 +3,23 @@ import type { CacheableUser, ILocalUser, } from "@/models/entities/user.js"; -import { User } from "@/models/entities/user.js"; import { Users } from "@/models/index.js"; import { Cache } from "@/misc/cache.js"; -import { subscriber } from "@/db/redis.js"; +import { redisClient, subscriber } from "@/db/redis.js"; -export const userByIdCache = new Cache<CacheableUser>(Infinity); +export const userByIdCache = new Cache<CacheableUser>("userById", 60 * 30); export const localUserByNativeTokenCache = new Cache<CacheableLocalUser | null>( - Infinity, + "localUserByNativeToken", + 60 * 30, +); +export const localUserByIdCache = new Cache<CacheableLocalUser>( + "localUserByIdCache", + 60 * 30, +); +export const uriPersonCache = new Cache<CacheableUser | null>( + "uriPerson", + 60 * 30, ); -export const localUserByIdCache = new Cache<CacheableLocalUser>(Infinity); -export const uriPersonCache = new Cache<CacheableUser | null>(Infinity); subscriber.on("message", async (_, data) => { const obj = JSON.parse(data); @@ -22,13 +28,12 @@ subscriber.on("message", async (_, data) => { const { type, body } = obj.message; switch (type) { case "localUserUpdated": { - userByIdCache.delete(body.id); - localUserByIdCache.delete(body.id); - localUserByNativeTokenCache.cache.forEach((v, k) => { - if (v.value?.id === body.id) { - localUserByNativeTokenCache.delete(k); - } - }); + await userByIdCache.delete(body.id); + await localUserByIdCache.delete(body.id); + const toDelete = Array.from(await localUserByNativeTokenCache.getAll()) + .filter((v) => v[1]?.id === body.id) + .map((v) => v[0]); + await localUserByNativeTokenCache.delete(...toDelete); break; } case "userChangeSuspendedState": @@ -36,15 +41,17 @@ subscriber.on("message", async (_, data) => { case "userChangeModeratorState": case "remoteUserUpdated": { const user = await Users.findOneByOrFail({ id: body.id }); - userByIdCache.set(user.id, user); - for (const [k, v] of uriPersonCache.cache.entries()) { - if (v.value?.id === user.id) { - uriPersonCache.set(k, user); + await userByIdCache.set(user.id, user); + const trans = redisClient.multi(); + for (const [k, v] of (await uriPersonCache.getAll()).entries()) { + if (v?.id === user.id) { + await uriPersonCache.set(k, user, trans); } } + await trans.exec(); if (Users.isLocalUser(user)) { - localUserByNativeTokenCache.set(user.token, user); - localUserByIdCache.set(user.id, user); + await localUserByNativeTokenCache.set(user.token, user); + await localUserByIdCache.set(user.id, user); } break; } @@ -52,8 +59,8 @@ subscriber.on("message", async (_, data) => { const user = (await Users.findOneByOrFail({ id: body.id, })) as ILocalUser; - localUserByNativeTokenCache.delete(body.oldToken); - localUserByNativeTokenCache.set(body.newToken, user); + await localUserByNativeTokenCache.delete(body.oldToken); + await localUserByNativeTokenCache.set(body.newToken, user); break; } default: diff --git a/packages/backend/test/resources/image.svg b/packages/backend/test/resources/image.svg index 1e2bf5b5bb..983f0ae648 100644 --- a/packages/backend/test/resources/image.svg +++ b/packages/backend/test/resources/image.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#FF40A4" d="M128 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C164 84 144 76 128 80"/><path fill="#FFBF40" d="M192 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C228 84 208 76 192 80"/><path fill="#408EFF" d="M64 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8C28 172 48 180 64 176s20-24 20-48v-16c0-8 8-16 20.3-8C100 84 80 76 64 80"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#FF40A4" d="M128 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C164 84 144 76 128 80"/><path fill="#FFBF40" d="M192 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C228 84 208 76 192 80"/><path fill="#408EFF" d="M64 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8C28 172 48 180 64 176s20-24 20-48v-16c0-8 8-16 20.3-8C100 84 80 76 64 80"/></svg> \ No newline at end of file diff --git a/packages/backend/test/resources/with-xml-def.svg b/packages/backend/test/resources/with-xml-def.svg index 90971215a6..983f0ae648 100644 --- a/packages/backend/test/resources/with-xml-def.svg +++ b/packages/backend/test/resources/with-xml-def.svg @@ -1,2 +1 @@ -<?xml version="1.0" encoding="utf-8"?> -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#FF40A4" d="M128 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C164 84 144 76 128 80"/><path fill="#FFBF40" d="M192 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C228 84 208 76 192 80"/><path fill="#408EFF" d="M64 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8C28 172 48 180 64 176s20-24 20-48v-16c0-8 8-16 20.3-8C100 84 80 76 64 80"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#FF40A4" d="M128 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C164 84 144 76 128 80"/><path fill="#FFBF40" d="M192 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8 4.3 20 24.3 28 40.3 24s20-24 20-48v-16c0-8 8-16 20.3-8C228 84 208 76 192 80"/><path fill="#408EFF" d="M64 80c-16 4-20 24-20 48v16c0 8-8 16-20.3 8C28 172 48 180 64 176s20-24 20-48v-16c0-8 8-16 20.3-8C100 84 80 76 64 80"/></svg> \ No newline at end of file diff --git a/packages/calckey-js/.swcrc b/packages/calckey-js/.swcrc new file mode 100644 index 0000000000..508e597b5c --- /dev/null +++ b/packages/calckey-js/.swcrc @@ -0,0 +1,20 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "parser": { + "syntax": "typescript", + "dynamicImport": true, + "decorators": true + }, + "transform": { + "legacyDecorator": true, + "decoratorMetadata": true + }, + "target": "es2022" + }, + "minify": false, + "module": { + "type": "commonjs", + "strict": true + } +} diff --git a/packages/calckey-js/README.md b/packages/calckey-js/README.md index b7a699285b..0aef8d6b0d 100644 --- a/packages/calckey-js/README.md +++ b/packages/calckey-js/README.md @@ -4,4 +4,6 @@ Fork of Misskey.js for Calckey https://www.npmjs.com/package/calckey-js - \ No newline at end of file +To fully build, run `pnpm i && pnpm run render`. + + diff --git a/packages/calckey-js/etc/calckey-js.api.json b/packages/calckey-js/etc/calckey-js.api.json new file mode 100644 index 0000000000..61ab4e2473 --- /dev/null +++ b/packages/calckey-js/etc/calckey-js.api.json @@ -0,0 +1,9814 @@ +{ + "metadata": { + "toolPackage": "@microsoft/api-extractor", + "toolVersion": "7.36.0", + "schemaVersion": 1011, + "oldestForwardsCompatibleVersion": 1001, + "tsdocConfig": { + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "noStandardTags": true, + "tagDefinitions": [ + { + "tagName": "@alpha", + "syntaxKind": "modifier" + }, + { + "tagName": "@beta", + "syntaxKind": "modifier" + }, + { + "tagName": "@defaultValue", + "syntaxKind": "block" + }, + { + "tagName": "@decorator", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@deprecated", + "syntaxKind": "block" + }, + { + "tagName": "@eventProperty", + "syntaxKind": "modifier" + }, + { + "tagName": "@example", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@experimental", + "syntaxKind": "modifier" + }, + { + "tagName": "@inheritDoc", + "syntaxKind": "inline" + }, + { + "tagName": "@internal", + "syntaxKind": "modifier" + }, + { + "tagName": "@label", + "syntaxKind": "inline" + }, + { + "tagName": "@link", + "syntaxKind": "inline", + "allowMultiple": true + }, + { + "tagName": "@override", + "syntaxKind": "modifier" + }, + { + "tagName": "@packageDocumentation", + "syntaxKind": "modifier" + }, + { + "tagName": "@param", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@privateRemarks", + "syntaxKind": "block" + }, + { + "tagName": "@public", + "syntaxKind": "modifier" + }, + { + "tagName": "@readonly", + "syntaxKind": "modifier" + }, + { + "tagName": "@remarks", + "syntaxKind": "block" + }, + { + "tagName": "@returns", + "syntaxKind": "block" + }, + { + "tagName": "@sealed", + "syntaxKind": "modifier" + }, + { + "tagName": "@see", + "syntaxKind": "block" + }, + { + "tagName": "@throws", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@typeParam", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@virtual", + "syntaxKind": "modifier" + }, + { + "tagName": "@betaDocumentation", + "syntaxKind": "modifier" + }, + { + "tagName": "@internalRemarks", + "syntaxKind": "block" + }, + { + "tagName": "@preapproved", + "syntaxKind": "modifier" + } + ], + "supportForTags": { + "@alpha": true, + "@beta": true, + "@defaultValue": true, + "@decorator": true, + "@deprecated": true, + "@eventProperty": true, + "@example": true, + "@experimental": true, + "@inheritDoc": true, + "@internal": true, + "@label": true, + "@link": true, + "@override": true, + "@packageDocumentation": true, + "@param": true, + "@privateRemarks": true, + "@public": true, + "@readonly": true, + "@remarks": true, + "@returns": true, + "@sealed": true, + "@see": true, + "@throws": true, + "@typeParam": true, + "@virtual": true, + "@betaDocumentation": true, + "@internalRemarks": true, + "@preapproved": true + }, + "reportUnsupportedHtmlElements": false + } + }, + "kind": "Package", + "canonicalReference": "calckey-js!", + "docComment": "", + "name": "calckey-js", + "preserveMemberOrder": false, + "members": [ + { + "kind": "EntryPoint", + "canonicalReference": "calckey-js!", + "name": "", + "preserveMemberOrder": false, + "members": [ + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Acct:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Acct = " + }, + { + "kind": "Content", + "text": "{\n\tusername: string;\n\thost: string | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/acct.ts", + "releaseTag": "Public", + "name": "Acct", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Namespace", + "canonicalReference": "calckey-js!api:namespace", + "docComment": "", + "excerptTokens": [], + "fileUrlPath": "src/index.ts", + "releaseTag": "None", + "name": "api", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Class", + "canonicalReference": "calckey-js!api.APIClient:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare class APIClient " + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "isAbstract": false, + "name": "APIClient", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!api.APIClient:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `APIClient` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(opts: " + }, + { + "kind": "Content", + "text": "{\n\t\torigin: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"origin\"];\n\t\tcredential?: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"credential\"];\n\t\tfetch?: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"fetch\"] | null | undefined;\n\t}" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "opts", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 8 + }, + "isOptional": false + } + ] + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#credential:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "credential: " + }, + { + "kind": "Content", + "text": "string | null | undefined" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "credential", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#fetch:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "fetch: " + }, + { + "kind": "Reference", + "text": "FetchLike", + "canonicalReference": "calckey-js!api.FetchLike:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "fetch", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#origin:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "origin: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "origin", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!api.APIClient#request:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "request<E extends " + }, + { + "kind": "Content", + "text": "keyof " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": ", P extends " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"req\"]" + }, + { + "kind": "Content", + "text": ">(\n\t\tendpoint: " + }, + { + "kind": "Content", + "text": "E" + }, + { + "kind": "Content", + "text": ",\n\t\tparams?: " + }, + { + "kind": "Content", + "text": "P" + }, + { + "kind": "Content", + "text": ",\n\t\tcredential?: " + }, + { + "kind": "Content", + "text": "string | null | undefined" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<\n\t\t" + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"] extends {\n\t\t\t$switch: {\n\t\t\t\t$cases: [any, any][];\n\t\t\t\t$default: any;\n\t\t\t};\n\t\t}\n\t\t\t? " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 0> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 0>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 1> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 1>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 2> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 2>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 3> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 3>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 4> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 4>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 5> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 5>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 6> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 6>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 7> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 7>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 8> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 8>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": "<E, P, 9> extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "<E, P, 9>\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"][\"$switch\"][\"$default\"]\n\t\t\t: " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"]\n\t>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "E", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + }, + { + "typeParameterName": "P", + "constraintTokenRange": { + "startIndex": 4, + "endIndex": 6 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 13, + "endIndex": 61 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "endpoint", + "parameterTypeTokenRange": { + "startIndex": 7, + "endIndex": 8 + }, + "isOptional": false + }, + { + "parameterName": "params", + "parameterTypeTokenRange": { + "startIndex": 9, + "endIndex": 10 + }, + "isOptional": true + }, + { + "parameterName": "credential", + "parameterTypeTokenRange": { + "startIndex": 11, + "endIndex": 12 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "request" + } + ], + "implementsTokenRanges": [] + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!api.APIError:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type APIError = " + }, + { + "kind": "Content", + "text": "{\n\tid: string;\n\tcode: string;\n\tmessage: string;\n\tkind: \"client\" | \"server\";\n\tinfo: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "name": "APIError", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!api.FetchLike:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FetchLike = " + }, + { + "kind": "Content", + "text": "(\n\tinput: string,\n\tinit?: {\n\t\tmethod?: string;\n\t\tbody?: string;\n\t\tcredentials?: " + }, + { + "kind": "Reference", + "text": "RequestCredentials", + "canonicalReference": "!RequestCredentials:type" + }, + { + "kind": "Content", + "text": ";\n\t\tcache?: " + }, + { + "kind": "Reference", + "text": "RequestCache", + "canonicalReference": "!RequestCache:type" + }, + { + "kind": "Content", + "text": ";\n\t},\n) => " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<{\n\tstatus: number;\n\tjson(): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<any>;\n}>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "name": "FetchLike", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "Function", + "canonicalReference": "calckey-js!api.isAPIError:function(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare function isAPIError(reason: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "reason", + "canonicalReference": "calckey-js!~reason" + }, + { + "kind": "Content", + "text": " is " + }, + { + "kind": "Reference", + "text": "APIError", + "canonicalReference": "calckey-js!api.APIError:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 6 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "reason", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "name": "isAPIError" + } + ] + }, + { + "kind": "Class", + "canonicalReference": "calckey-js!ChannelConnection:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare abstract class Connection<\n\tChannel extends " + }, + { + "kind": "Reference", + "text": "AnyOf", + "canonicalReference": "calckey-js!~AnyOf:type" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": ">" + }, + { + "kind": "Content", + "text": " = " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ",\n> extends " + }, + { + "kind": "Reference", + "text": "EventEmitter", + "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" + }, + { + "kind": "Content", + "text": "<Channel[\"events\"]>" + }, + { + "kind": "Content", + "text": " " + } + ], + "fileUrlPath": "src/streaming.ts", + "releaseTag": "Public", + "typeParameters": [ + { + "typeParameterName": "Channel", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "defaultTypeTokenRange": { + "startIndex": 6, + "endIndex": 7 + } + } + ], + "isAbstract": true, + "name": "ChannelConnection", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!ChannelConnection:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `Connection` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(stream: " + }, + { + "kind": "Reference", + "text": "Stream", + "canonicalReference": "calckey-js!Stream:class" + }, + { + "kind": "Content", + "text": ", channel: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ", name?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "stream", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "channel", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": true + } + ] + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#channel:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "channel: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "channel", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!ChannelConnection#dispose:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract dispose(): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [], + "isOptional": false, + "isAbstract": true, + "name": "dispose" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#id:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract id: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "id", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": true + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#inCount:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "inCount: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "inCount", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#name:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "name?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "name", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#outCount:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "outCount: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "outCount", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!ChannelConnection#send:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "send<T extends " + }, + { + "kind": "Content", + "text": "keyof Channel[\"receives\"]" + }, + { + "kind": "Content", + "text": ">(\n\t\ttype: " + }, + { + "kind": "Content", + "text": "T" + }, + { + "kind": "Content", + "text": ",\n\t\tbody: " + }, + { + "kind": "Content", + "text": "Channel[\"receives\"][T]" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "T", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 7, + "endIndex": 8 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "type", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "body", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#stream:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "protected stream: " + }, + { + "kind": "Reference", + "text": "Stream", + "canonicalReference": "calckey-js!Stream:class" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "stream", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": true, + "isAbstract": false + } + ], + "extendsTokenRange": { + "startIndex": 8, + "endIndex": 10 + }, + "implementsTokenRanges": [] + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Channels:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Channels = " + }, + { + "kind": "Content", + "text": "{\n\tmain: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnotification: (payload: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tmention: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treply: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\trenote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tfollow: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tfollowed: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunfollow: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tmeUpdated: (payload: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tpageEvent: (payload: " + }, + { + "kind": "Reference", + "text": "PageEvent", + "canonicalReference": "calckey-js!entities.PageEvent:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\turlUploadFinished: (payload: {\n\t\t\t\tmarker: string;\n\t\t\t\tfile: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t}) => void;\n\t\t\treadAllNotifications: () => void;\n\t\t\tunreadNotification: (payload: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunreadMention: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadMentions: () => void;\n\t\t\tunreadSpecifiedNote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadSpecifiedNotes: () => void;\n\t\t\treadAllMessagingMessages: () => void;\n\t\t\tmessagingMessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunreadMessagingMessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAllAntennas: () => void;\n\t\t\tunreadAntenna: (payload: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAllAnnouncements: () => void;\n\t\t\treadAllChannels: () => void;\n\t\t\tunreadChannel: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\tmyTokenRegenerated: () => void;\n\t\t\treversiNoInvites: () => void;\n\t\t\treversiInvited: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tsignin: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tregistryUpdated: (payload: {\n\t\t\t\tscope?: string[];\n\t\t\t\tkey: string;\n\t\t\t\tvalue: any | null;\n\t\t\t}) => void;\n\t\t\tdriveFileCreated: (payload: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAntenna: (payload: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thomeTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tlocalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thybridTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\trecommendedTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tglobalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tantenna: {\n\t\tparams: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tmessaging: {\n\t\tparams: {\n\t\t\totherparty?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tgroup?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tevents: {\n\t\t\tmessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tdeleted: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\tread: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"][]) => void;\n\t\t\ttypers: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[]) => void;\n\t\t};\n\t\treceives: {\n\t\t\tread: {\n\t\t\t\tid: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\t};\n\t\t};\n\t};\n\tserverStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n\tqueueStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/streaming.types.ts", + "releaseTag": "Public", + "name": "Channels", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 76 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Endpoints:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Endpoints = " + }, + { + "kind": "Content", + "text": "{\n\t\"admin/abuse-user-reports\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/delete-all-files-of-a-user\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/delete-logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\t\"admin/get-index-stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/get-table-stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/invite\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/meta\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/reset-password\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/resolve-abuse-user-report\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/resync-chart\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/send-email\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/server-info\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-moderation-logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/silence-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/suspend-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/unsilence-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/unsuspend-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/update-meta\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/vacuum\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/accounts/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/delete\": {\n\t\treq: {\n\t\t\tid: " + }, + { + "kind": "Reference", + "text": "Ad", + "canonicalReference": "calckey-js!entities.Ad:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/ad/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/delete\": {\n\t\treq: {\n\t\t\tid: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/announcements/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/clean-remote-files\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/cleanup\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/files\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/show-file\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/copy\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/list-remote\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/delete-all-files\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/federation/refresh-remote-instance-metadata\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/remove-all-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/update-instance\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/moderators/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/moderators/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/promo/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/clear\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/deliver-delayed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/inbox-delayed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/jobs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tannouncements: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\twithUnreads?: boolean;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/delete\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"antennas/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/notes\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/show\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/mark-read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"ap/get\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\t};\n\t\"ap/show\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres:\n\t\t\t| {\n\t\t\t\t\ttype: \"Note\";\n\t\t\t\t\tobject: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\ttype: \"User\";\n\t\t\t\t\tobject: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t };\n\t};\n\t\"app/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"app/show\": {\n\t\treq: {\n\t\t\tappId: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"auth/accept\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"auth/session/generate\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t};\n\t\tres: {\n\t\t\ttoken: string;\n\t\t\turl: string;\n\t\t};\n\t};\n\t\"auth/session/show\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "AuthSession", + "canonicalReference": "calckey-js!entities.AuthSession:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"auth/session/userkey\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t\ttoken: string;\n\t\t};\n\t\tres: {\n\t\t\taccessToken: string;\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"blocking/create\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"blocking/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"blocking/list\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"channels/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/follow\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/followed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/owned\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/pin-note\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/timeline\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/unfollow\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/active-users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/federation\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tinstance: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/hashtag\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/instance\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\tdrive: {\n\t\t\t\tdecFiles: number[];\n\t\t\t\tdecUsage: number[];\n\t\t\t\tincFiles: number[];\n\t\t\t\tincUsage: number[];\n\t\t\t\ttotalFiles: number[];\n\t\t\t\ttotalUsage: number[];\n\t\t\t};\n\t\t\tfollowers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tfollowing: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tnotes: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\trequests: {\n\t\t\t\tfailed: number[];\n\t\t\t\treceived: number[];\n\t\t\t\tsucceeded: number[];\n\t\t\t};\n\t\t\tusers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/network\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdecCount: number[];\n\t\t\tdecSize: number[];\n\t\t\tincCount: number[];\n\t\t\tincSize: number[];\n\t\t\ttotalCount: number[];\n\t\t\ttotalSize: number[];\n\t\t};\n\t};\n\t\"charts/user/following\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/user/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdec: number[];\n\t\t\tinc: number[];\n\t\t\ttotal: number[];\n\t\t\tdiffs: {\n\t\t\t\tnormal: number[];\n\t\t\t\trenote: number[];\n\t\t\t\treply: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/reactions\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"clips/add-note\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/delete\": {\n\t\treq: {\n\t\t\tclipId: " + }, + { + "kind": "Reference", + "text": "Clip", + "canonicalReference": "calckey-js!entities.Clip:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"clips/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tdrive: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcapacity: number;\n\t\t\tusage: number;\n\t\t};\n\t};\n\t\"drive/files\": {\n\t\treq: {\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\ttype?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/files/attached-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/check-existence\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/delete\": {\n\t\treq: {\n\t\t\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/files/find-by-hash\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/files/show\": {\n\t\treq: {\n\t\t\tfileId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\turl?: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/update\": {\n\t\treq: {\n\t\t\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tname?: string;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/upload-from-url\": {\n\t\treq: {\n\t\t\turl: string;\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t\tmarker?: string | null;\n\t\t\tforce?: boolean;\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders\": {\n\t\treq: {\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/folders/create\": {\n\t\treq: {\n\t\t\tname?: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/folders/delete\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/folders/show\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/folders/update\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/stream\": {\n\t\treq: {\n\t\t\ttype?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\tendpoint: {\n\t\treq: {\n\t\t\tendpoint: string;\n\t\t};\n\t\tres: {\n\t\t\tparams: {\n\t\t\t\tname: string;\n\t\t\t\ttype: string;\n\t\t\t}[];\n\t\t};\n\t};\n\tendpoints: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: string[];\n\t};\n\t\"federation/dns\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\ta: string[];\n\t\t\taaaa: string[];\n\t\t\tcname: string[];\n\t\t\ttxt: string[];\n\t\t};\n\t};\n\t\"federation/followers\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/following\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/instances\": {\n\t\treq: {\n\t\t\thost?: string | null;\n\t\t\tblocked?: boolean | null;\n\t\t\tnotResponding?: boolean | null;\n\t\t\tsuspended?: boolean | null;\n\t\t\tfederating?: boolean | null;\n\t\t\tsubscribing?: boolean | null;\n\t\t\tpublishing?: boolean | null;\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?:\n\t\t\t\t| \"+pubSub\"\n\t\t\t\t| \"-pubSub\"\n\t\t\t\t| \"+notes\"\n\t\t\t\t| \"-notes\"\n\t\t\t\t| \"+users\"\n\t\t\t\t| \"-users\"\n\t\t\t\t| \"+following\"\n\t\t\t\t| \"-following\"\n\t\t\t\t| \"+followers\"\n\t\t\t\t| \"-followers\"\n\t\t\t\t| \"+caughtAt\"\n\t\t\t\t| \"-caughtAt\"\n\t\t\t\t| \"+lastCommunicatedAt\"\n\t\t\t\t| \"-lastCommunicatedAt\"\n\t\t\t\t| \"+driveUsage\"\n\t\t\t\t| \"-driveUsage\"\n\t\t\t\t| \"+driveFiles\"\n\t\t\t\t| \"-driveFiles\";\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/show-instance\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"federation/update-remote-user\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"federation/users\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"following/create\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/requests/accept\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"following/requests/cancel\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/requests/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowRequest", + "canonicalReference": "calckey-js!entities.FollowRequest:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"following/requests/reject\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/popular\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/delete\": {\n\t\treq: {\n\t\t\tpostId: " + }, + { + "kind": "Reference", + "text": "GalleryPost", + "canonicalReference": "calckey-js!entities.GalleryPost:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/posts/like\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/unlike\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games/surrender\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/invitations\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/match\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/match/cancel\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"get-online-users-count\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcount: number;\n\t\t};\n\t};\n\t\"hashtags/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/trend\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\ti: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/authorized-apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/change-password\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/delete-account\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/export-blocking\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-mute\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-user-lists\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/favorites\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/gallery/likes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/get-word-muted-notes-count\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/import-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/import-user-lists\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/move\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/known-as\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/notifications\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tfollowing?: boolean;\n\t\t\tmarkAsRead?: boolean;\n\t\t\tincludeTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t\texcludeTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/page-likes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/pages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/pin\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-all-messaging-messages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-all-unread-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-announcement\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/regenerate-token\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/get-all\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\t};\n\t\"i/registry/get-detail\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: {\n\t\t\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tvalue: any;\n\t\t};\n\t};\n\t\"i/registry/get\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: any;\n\t};\n\t\"i/registry/keys-with-type\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<\n\t\t\tstring,\n\t\t\t\"null\" | \"array\" | \"number\" | \"string\" | \"boolean\" | \"object\"\n\t\t>;\n\t};\n\t\"i/registry/keys\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: string[];\n\t};\n\t\"i/registry/remove\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/scopes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: string[][];\n\t};\n\t\"i/registry/set\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tvalue: any;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/revoke-token\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/signin-history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/unpin\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/update-email\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t\temail?: string | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/update\": {\n\t\treq: {\n\t\t\tname?: string | null;\n\t\t\tdescription?: string | null;\n\t\t\tlang?: string | null;\n\t\t\tlocation?: string | null;\n\t\t\tbirthday?: string | null;\n\t\t\tavatarId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tbannerId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tfields?: {\n\t\t\t\tname: string;\n\t\t\t\tvalue: string;\n\t\t\t}[];\n\t\t\tisLocked?: boolean;\n\t\t\tisExplorable?: boolean;\n\t\t\thideOnlineStatus?: boolean;\n\t\t\tcarefulBot?: boolean;\n\t\t\tautoAcceptFollowed?: boolean;\n\t\t\tnoCrawle?: boolean;\n\t\t\tpreventAiLearning?: boolean;\n\t\t\tisBot?: boolean;\n\t\t\tisCat?: boolean;\n\t\t\tinjectFeaturedNote?: boolean;\n\t\t\treceiveAnnouncementEmail?: boolean;\n\t\t\talwaysMarkNsfw?: boolean;\n\t\t\tmutedWords?: string[][];\n\t\t\tmutingNotificationTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t\temailNotificationTypes?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/user-group-invites\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/done\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/key-done\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/password-less\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/register-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/register\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/update-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/remove-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/unregister\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"messaging/history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tgroup?: boolean;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"messaging/messages\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tgroupId?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tmarkAsRead?: boolean;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"messaging/messages/create\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tgroupId?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\ttext?: string;\n\t\t\tfileId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"messaging/messages/delete\": {\n\t\treq: {\n\t\t\tmessageId: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"messaging/messages/read\": {\n\t\treq: {\n\t\t\tmessageId: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\tmeta: {\n\t\treq: {\n\t\t\tdetail?: boolean;\n\t\t};\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: boolean;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": " | " + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"miauth/gen-token\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"mute/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"mute/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"renote-mute/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"renote-mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"renote-mute/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"my/apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tnotes: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/children\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/clips\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/conversation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoteSubmitReq", + "canonicalReference": "calckey-js!~NoteSubmitReq:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"notes/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/edit\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoteSubmitReq", + "canonicalReference": "calckey-js!~NoteSubmitReq:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"notes/favorites/create\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/favorites/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/global-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/recommended-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/hybrid-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/local-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/mentions\": {\n\t\treq: {\n\t\t\tfollowing?: boolean;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/polls/recommendation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/polls/vote\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tchoice: number;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\ttype?: string | null;\n\t\t\tlimit?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "NoteReaction", + "canonicalReference": "calckey-js!entities.NoteReaction:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/reactions/create\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\treaction: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/renotes\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/replies\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/search-by-tag\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/show\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/state\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/unrenote\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/user-list-timeline\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/watching/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/watching/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/create\": {\n\t\treq: {\n\t\t\tbody: string;\n\t\t\theader?: string | null;\n\t\t\ticon?: string | null;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/mark-all-as-read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\t\"notifications/read\": {\n\t\treq: {\n\t\t\tnotificationId: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"page-push\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tevent: string;\n\t\t\tvar?: any;\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"pages/delete\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"pages/like\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/show\": {\n\t\treq: {\n\t\t\tpageId?: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tusername?: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"pages/unlike\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\tping: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tpong: number;\n\t\t};\n\t};\n\t\"pinned-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"promo/read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"request-reset-password\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t\temail: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"reset-password\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"room/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"room/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tstats: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Stats", + "canonicalReference": "calckey-js!entities.Stats:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"server-info\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "ServerInfo", + "canonicalReference": "calckey-js!entities.ServerInfo:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"latest-version\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"sw/register\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"username/available\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t};\n\t\tres: {\n\t\t\tavailable: boolean;\n\t\t};\n\t};\n\tusers: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?: " + }, + { + "kind": "Reference", + "text": "UserSorting", + "canonicalReference": "calckey-js!entities.UserSorting:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\torigin?: " + }, + { + "kind": "Reference", + "text": "OriginType", + "canonicalReference": "calckey-js!entities.OriginType:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/clips\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/followers\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tusername?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"username\"];\n\t\t\thost?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFollowerPopulated", + "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/following\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tusername?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"username\"];\n\t\t\thost?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/get-frequently-replied-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/delete\": {\n\t\treq: {\n\t\t\tgroupId: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/groups/invitations/accept\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/invitations/reject\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/invite\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/joined\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/owned\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/pull\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/transfer\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/create\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/delete\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/lists/pull\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/push\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/show\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/update\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/notes\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/pages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/recommendation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/relation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/report-abuse\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/search-by-username-and-host\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/show\": {\n\t\treq:\n\t\t\t| " + }, + { + "kind": "Reference", + "text": "ShowUserReq", + "canonicalReference": "calckey-js!~ShowUserReq:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t| {\n\t\t\t\t\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\t\t\t };\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": "[],\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"users/stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.types.ts", + "releaseTag": "Public", + "name": "Endpoints", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 1158 + } + }, + { + "kind": "Namespace", + "canonicalReference": "calckey-js!entities:namespace", + "docComment": "", + "excerptTokens": [], + "fileUrlPath": "src/index.ts", + "releaseTag": "None", + "name": "entities", + "preserveMemberOrder": false, + "members": [ + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Ad:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Ad = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Ad", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Announcement:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Announcement = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\ttext: string;\n\ttitle: string;\n\timageUrl: string | null;\n\tisRead?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Announcement", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Antenna:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Antenna = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tname: string;\n\tkeywords: string[][];\n\texcludeKeywords: string[][];\n\tsrc: \"home\" | \"all\" | \"users\" | \"list\" | \"group\" | \"instances\";\n\tuserListId: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": " | null;\n\tuserGroupId: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": " | null;\n\tusers: string[];\n\tinstances: string[];\n\tcaseSensitive: boolean;\n\tnotify: boolean;\n\twithReplies: boolean;\n\twithFile: boolean;\n\thasUnreadNote: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Antenna", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.App:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type App = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "App", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.AuthSession:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type AuthSession = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tapp: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\ttoken: string;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "AuthSession", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 6 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Blocking:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Blocking = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tblockeeId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tblockee: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Blocking", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Channel:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Channel = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Channel", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Clip:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Clip = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Clip", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.CustomEmoji:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type CustomEmoji = " + }, + { + "kind": "Content", + "text": "{\n\tid: string;\n\tname: string;\n\turl: string;\n\tcategory: string;\n\taliases: string[];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "CustomEmoji", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DateString:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DateString = " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DateString", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DetailedInstanceMetadata = " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": " & {\n\tfeatures: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DetailedInstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DriveFile:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DriveFile = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisSensitive: boolean;\n\tname: string;\n\tthumbnailUrl: string;\n\turl: string;\n\ttype: string;\n\tsize: number;\n\tmd5: string;\n\tblurhash: string;\n\tcomment: string | null;\n\tproperties: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DriveFile", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DriveFolder:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DriveFolder = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DriveFolder", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Following:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Following = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tfollowerId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tfolloweeId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Following", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowingFolloweePopulated = " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": " & {\n\tfollowee: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowingFolloweePopulated", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowingFollowerPopulated = " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": " & {\n\tfollower: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowingFollowerPopulated", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowRequest:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowRequest = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tfollower: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tfollowee: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowRequest", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.GalleryPost:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type GalleryPost = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "GalleryPost", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.ID:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type ID = " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "ID", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Instance:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Instance = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcaughtAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\thost: string;\n\tusersCount: number;\n\tnotesCount: number;\n\tfollowingCount: number;\n\tfollowersCount: number;\n\tdriveUsage: number;\n\tdriveFiles: number;\n\tlatestRequestSentAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\tlatestStatus: number | null;\n\tlatestRequestReceivedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\tlastCommunicatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisNotResponding: boolean;\n\tisSuspended: boolean;\n\tsoftwareName: string | null;\n\tsoftwareVersion: string | null;\n\topenRegistrations: boolean | null;\n\tname: string | null;\n\tdescription: string | null;\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\ticonUrl: string | null;\n\tfaviconUrl: string | null;\n\tthemeColor: string | null;\n\tinfoUpdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Instance", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 14 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.InstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type InstanceMetadata =\n\t" + }, + { + "kind": "Content", + "text": "| " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": "\n\t| " + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "InstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type LiteInstanceMetadata = " + }, + { + "kind": "Content", + "text": "{\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\tversion: string;\n\tname: string | null;\n\turi: string;\n\tdescription: string | null;\n\ttosUrl: string | null;\n\tdisableRegistration: boolean;\n\tdisableLocalTimeline: boolean;\n\tdisableRecommendedTimeline: boolean;\n\tdisableGlobalTimeline: boolean;\n\tdriveCapacityPerLocalUserMb: number;\n\tdriveCapacityPerRemoteUserMb: number;\n\tenableHcaptcha: boolean;\n\thcaptchaSiteKey: string | null;\n\tenableRecaptcha: boolean;\n\trecaptchaSiteKey: string | null;\n\tswPublickey: string | null;\n\tmaxNoteTextLength: number;\n\tenableEmail: boolean;\n\tenableTwitterIntegration: boolean;\n\tenableGithubIntegration: boolean;\n\tenableDiscordIntegration: boolean;\n\tenableServiceWorker: boolean;\n\temojis: " + }, + { + "kind": "Reference", + "text": "CustomEmoji", + "canonicalReference": "calckey-js!entities.CustomEmoji:type" + }, + { + "kind": "Content", + "text": "[];\n\tads: {\n\t\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\t\tratio: number;\n\t\tplace: string;\n\t\turl: string;\n\t\timageUrl: string;\n\t}[];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "LiteInstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 6 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.MeDetailed:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type MeDetailed = " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": " & {\n\tavatarId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tbannerId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tautoAcceptFollowed: boolean;\n\talwaysMarkNsfw: boolean;\n\tcarefulBot: boolean;\n\temailNotificationTypes: string[];\n\thasPendingReceivedFollowRequest: boolean;\n\thasUnreadAnnouncement: boolean;\n\thasUnreadAntenna: boolean;\n\thasUnreadChannel: boolean;\n\thasUnreadMentions: boolean;\n\thasUnreadMessagingMessage: boolean;\n\thasUnreadNotification: boolean;\n\thasUnreadSpecifiedNotes: boolean;\n\thideOnlineStatus: boolean;\n\tinjectFeaturedNote: boolean;\n\tintegrations: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\tisDeleted: boolean;\n\tisExplorable: boolean;\n\tmutedWords: string[][];\n\tmutingNotificationTypes: string[];\n\tnoCrawle: boolean;\n\tpreventAiLearning: boolean;\n\treceiveAnnouncementEmail: boolean;\n\tusePasswordLessLogin: boolean;\n\t[other: string]: any;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "MeDetailed", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 9 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.MessagingMessage:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type MessagingMessage = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tfile: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": " | null;\n\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\tisRead: boolean;\n\treads: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\ttext: string | null;\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\trecipient?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": " | null;\n\trecipientId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\tgroup?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": " | null;\n\tgroupId: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "MessagingMessage", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 24 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Note:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Note = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\ttext: string | null;\n\tcw: string | null;\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\treply?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\treplyId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\trenote?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\trenoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tfiles: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\tfileIds: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\tvisibility: \"public\" | \"home\" | \"followers\" | \"specified\";\n\tvisibleUserIds?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\tlocalOnly?: boolean;\n\tchannel?: " + }, + { + "kind": "Reference", + "text": "Channel", + "canonicalReference": "calckey-js!entities.Channel:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tmyReaction?: string;\n\treactions: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, number>;\n\trenoteCount: number;\n\trepliesCount: number;\n\tpoll?: {\n\t\texpiresAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\t\tmultiple: boolean;\n\t\tchoices: {\n\t\t\tisVoted: boolean;\n\t\t\ttext: string;\n\t\t\tvotes: number;\n\t\t}[];\n\t};\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\turi?: string;\n\turl?: string;\n\tupdatedAt?: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisHidden?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Note", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 32 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.NoteFavorite:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type NoteFavorite = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "NoteFavorite", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.NoteReaction:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type NoteReaction = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tuser: " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": ";\n\ttype: string;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "NoteReaction", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Notification:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Notification = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisRead: boolean;\n} & (\n\t| {\n\t\t\ttype: \"reaction\";\n\t\t\treaction: string;\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"reply\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"renote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"quote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"mention\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"pollVote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"follow\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"followRequestAccepted\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"receiveFollowRequest\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"groupInvited\";\n\t\t\tinvitation: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"app\";\n\t\t\theader?: string | null;\n\t\t\tbody: string;\n\t\t\ticon?: string | null;\n\t }\n)" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Notification", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 60 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.OriginType:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type OriginType = " + }, + { + "kind": "Content", + "text": "\"combined\" | \"local\" | \"remote\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "OriginType", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Page:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Page = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tcontent: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>[];\n\tvariables: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>[];\n\ttitle: string;\n\tname: string;\n\tsummary: string | null;\n\thideTitleWhenPinned: boolean;\n\talignCenter: boolean;\n\tfont: string;\n\tscript: string;\n\teyeCatchingImageId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\teyeCatchingImage: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": " | null;\n\tattachedFiles: any;\n\tlikedCount: number;\n\tisLiked?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Page", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 20 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.PageEvent:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type PageEvent = " + }, + { + "kind": "Content", + "text": "{\n\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tevent: string;\n\tvar: any;\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "PageEvent", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.ServerInfo:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type ServerInfo = " + }, + { + "kind": "Content", + "text": "{\n\tmachine: string;\n\tcpu: {\n\t\tmodel: string;\n\t\tcores: number;\n\t};\n\tmem: {\n\t\ttotal: number;\n\t};\n\tfs: {\n\t\ttotal: number;\n\t\tused: number;\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "ServerInfo", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Signin:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Signin = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tip: string;\n\theaders: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<string, any>;\n\tsuccess: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Signin", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Stats:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Stats = " + }, + { + "kind": "Content", + "text": "{\n\tnotesCount: number;\n\toriginalNotesCount: number;\n\tusersCount: number;\n\toriginalUsersCount: number;\n\tinstances: number;\n\tdriveUsageLocal: number;\n\tdriveUsageRemote: number;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Stats", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.User:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type User = " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": " | " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "User", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserDetailed:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserDetailed = " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": " & {\n\tbannerBlurhash: string | null;\n\tbannerColor: string | null;\n\tbannerUrl: string | null;\n\tbirthday: string | null;\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tdescription: string | null;\n\tffVisibility: \"public\" | \"followers\" | \"private\";\n\tfields: {\n\t\tname: string;\n\t\tvalue: string;\n\t}[];\n\tfollowersCount: number;\n\tfollowingCount: number;\n\thasPendingFollowRequestFromYou: boolean;\n\thasPendingFollowRequestToYou: boolean;\n\tisAdmin: boolean;\n\tisBlocked: boolean;\n\tisBlocking: boolean;\n\tisBot: boolean;\n\tisCat: boolean;\n\tisFollowed: boolean;\n\tisFollowing: boolean;\n\tisLocked: boolean;\n\tisModerator: boolean;\n\tisMuted: boolean;\n\tisRenoteMuted: boolean;\n\tisSilenced: boolean;\n\tisSuspended: boolean;\n\tlang: string | null;\n\tlastFetchedAt?: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tlocation: string | null;\n\tnotesCount: number;\n\tpinnedNoteIds: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": "[];\n\tpinnedNotes: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\tpinnedPage: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": " | null;\n\tpinnedPageId: string | null;\n\tpublicReactions: boolean;\n\tsecurityKeys: boolean;\n\ttwoFactorEnabled: boolean;\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\turi: string | null;\n\turl: string | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserDetailed", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 15 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserGroup:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserGroup = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserGroup", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserList:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserList = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tname: string;\n\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserList", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserLite:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserLite = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tusername: string;\n\thost: string | null;\n\tname: string;\n\tonlineStatus: \"online\" | \"active\" | \"offline\" | \"unknown\";\n\tavatarUrl: string;\n\tavatarBlurhash: string;\n\talsoKnownAs: string[];\n\tmovedToUri: any;\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\tinstance?: {\n\t\tname: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"name\"];\n\t\tsoftwareName: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"softwareName\"];\n\t\tsoftwareVersion: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"softwareVersion\"];\n\t\ticonUrl: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"iconUrl\"];\n\t\tfaviconUrl: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"faviconUrl\"];\n\t\tthemeColor: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"themeColor\"];\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserLite", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 16 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserSorting:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserSorting =\n\t" + }, + { + "kind": "Content", + "text": "| \"+follower\"\n\t| \"-follower\"\n\t| \"+createdAt\"\n\t| \"-createdAt\"\n\t| \"+updatedAt\"\n\t| \"-updatedAt\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserSorting", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ] + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!ffVisibility:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "ffVisibility: " + }, + { + "kind": "Content", + "text": "readonly [\"public\", \"followers\", \"private\"]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "ffVisibility", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!mutedNoteReasons:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "mutedNoteReasons: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"word\",\n\t\"manual\",\n\t\"spam\",\n\t\"other\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "mutedNoteReasons", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!noteVisibilities:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "noteVisibilities: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"public\",\n\t\"home\",\n\t\"followers\",\n\t\"specified\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "noteVisibilities", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!notificationTypes:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "notificationTypes: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"follow\",\n\t\"mention\",\n\t\"reply\",\n\t\"renote\",\n\t\"quote\",\n\t\"reaction\",\n\t\"pollVote\",\n\t\"pollEnded\",\n\t\"receiveFollowRequest\",\n\t\"followRequestAccepted\",\n\t\"groupInvited\",\n\t\"app\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "notificationTypes", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!permissions:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "permissions: " + }, + { + "kind": "Content", + "text": "string[]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "permissions", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Class", + "canonicalReference": "calckey-js!Stream:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export default class Stream extends " + }, + { + "kind": "Reference", + "text": "EventEmitter", + "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "StreamEvents", + "canonicalReference": "calckey-js!~StreamEvents:type" + }, + { + "kind": "Content", + "text": ">" + }, + { + "kind": "Content", + "text": " " + } + ], + "fileUrlPath": "src/streaming.ts", + "releaseTag": "Public", + "isAbstract": false, + "name": "Stream", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!Stream:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `Stream` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(\n\t\torigin: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ",\n\t\tuser: " + }, + { + "kind": "Content", + "text": "{\n\t\t\ttoken: string;\n\t\t} | null" + }, + { + "kind": "Content", + "text": ",\n\t\toptions?: " + }, + { + "kind": "Content", + "text": "{\n\t\t\tWebSocket?: any;\n\t\t}" + }, + { + "kind": "Content", + "text": ",\n\t);" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "origin", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "user", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "options", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": true + } + ] + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#close:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "close(): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [], + "isOptional": false, + "isAbstract": false, + "name": "close" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#disconnectToChannel:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "disconnectToChannel(connection: " + }, + { + "kind": "Reference", + "text": "NonSharedConnection", + "canonicalReference": "calckey-js!~NonSharedConnection:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "connection", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "disconnectToChannel" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#removeSharedConnection:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "removeSharedConnection(connection: " + }, + { + "kind": "Reference", + "text": "SharedConnection", + "canonicalReference": "calckey-js!~SharedConnection:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "connection", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "removeSharedConnection" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#removeSharedConnectionPool:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "removeSharedConnectionPool(pool: " + }, + { + "kind": "Reference", + "text": "Pool", + "canonicalReference": "calckey-js!~Pool:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "pool", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "removeSharedConnectionPool" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#send:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "send(typeOrPayload: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ", payload?: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "typeOrPayload", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "payload", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!Stream#state:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "state: " + }, + { + "kind": "Content", + "text": "\"initializing\" | \"reconnecting\" | \"connected\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "state", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#useChannel:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "useChannel<C extends " + }, + { + "kind": "Content", + "text": "keyof " + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": ">(\n\t\tchannel: " + }, + { + "kind": "Content", + "text": "C" + }, + { + "kind": "Content", + "text": ",\n\t\tparams?: " + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": "[C][\"params\"]" + }, + { + "kind": "Content", + "text": ",\n\t\tname?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Reference", + "text": "Connection", + "canonicalReference": "calckey-js!ChannelConnection:class" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": "[C]>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "C", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 11, + "endIndex": 15 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "channel", + "parameterTypeTokenRange": { + "startIndex": 4, + "endIndex": 5 + }, + "isOptional": false + }, + { + "parameterName": "params", + "parameterTypeTokenRange": { + "startIndex": 6, + "endIndex": 8 + }, + "isOptional": true + }, + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 9, + "endIndex": 10 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "useChannel" + } + ], + "extendsTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "implementsTokenRanges": [] + } + ] + } + ] +} diff --git a/packages/calckey-js/etc/calckey-js.api.md b/packages/calckey-js/etc/calckey-js.api.md index 9e19852d4a..bb441fef87 100644 --- a/packages/calckey-js/etc/calckey-js.api.md +++ b/packages/calckey-js/etc/calckey-js.api.md @@ -8,42 +8,43 @@ import { EventEmitter } from 'eventemitter3'; // @public (undocumented) export type Acct = { - username: string; - host: string | null; + username: string; + host: string | null; }; -// Warning: (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "TODO_2" needs to be exported by the entry point index.d.ts // // @public (undocumented) type Ad = TODO_2; // @public (undocumented) type Announcement = { - id: ID; - createdAt: DateString; - updatedAt: DateString | null; - text: string; - title: string; - imageUrl: string | null; - isRead?: boolean; + id: ID; + createdAt: DateString; + updatedAt: DateString | null; + text: string; + title: string; + imageUrl: string | null; + isRead?: boolean; }; // @public (undocumented) type Antenna = { - id: ID; - createdAt: DateString; - name: string; - keywords: string[][]; - excludeKeywords: string[][]; - src: 'home' | 'all' | 'users' | 'list' | 'group'; - userListId: ID | null; - userGroupId: ID | null; - users: string[]; - caseSensitive: boolean; - notify: boolean; - withReplies: boolean; - withFile: boolean; - hasUnreadNote: boolean; + id: ID; + createdAt: DateString; + name: string; + keywords: string[][]; + excludeKeywords: string[][]; + src: "home" | "all" | "users" | "list" | "group" | "instances"; + userListId: ID | null; + userGroupId: ID | null; + users: string[]; + instances: string[]; + caseSensitive: boolean; + notify: boolean; + withReplies: boolean; + withFile: boolean; + hasUnreadNote: boolean; }; declare namespace api { @@ -58,36 +59,64 @@ export { api } // @public (undocumented) class APIClient { - constructor(opts: { - origin: APIClient['origin']; - credential?: APIClient['credential']; - fetch?: APIClient['fetch'] | null | undefined; - }); - // (undocumented) + constructor(opts: { + origin: APIClient["origin"]; + credential?: APIClient["credential"]; + fetch?: APIClient["fetch"] | null | undefined; + }); + // (undocumented) credential: string | null | undefined; - // (undocumented) + // (undocumented) fetch: FetchLike; - // (undocumented) + // (undocumented) origin: string; - // Warning: (ae-forgotten-export) The symbol "IsCaseMatched" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "IsCaseMatched" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "GetCaseResult" needs to be exported by the entry point index.d.ts // // (undocumented) - request<E extends keyof Endpoints, P extends Endpoints[E]['req']>(endpoint: E, params?: P, credential?: string | null | undefined): Promise<Endpoints[E]['res'] extends { - $switch: { - $cases: [any, any][]; - $default: any; - }; - } ? IsCaseMatched<E, P, 0> extends true ? GetCaseResult<E, P, 0> : IsCaseMatched<E, P, 1> extends true ? GetCaseResult<E, P, 1> : IsCaseMatched<E, P, 2> extends true ? GetCaseResult<E, P, 2> : IsCaseMatched<E, P, 3> extends true ? GetCaseResult<E, P, 3> : IsCaseMatched<E, P, 4> extends true ? GetCaseResult<E, P, 4> : IsCaseMatched<E, P, 5> extends true ? GetCaseResult<E, P, 5> : IsCaseMatched<E, P, 6> extends true ? GetCaseResult<E, P, 6> : IsCaseMatched<E, P, 7> extends true ? GetCaseResult<E, P, 7> : IsCaseMatched<E, P, 8> extends true ? GetCaseResult<E, P, 8> : IsCaseMatched<E, P, 9> extends true ? GetCaseResult<E, P, 9> : Endpoints[E]['res']['$switch']['$default'] : Endpoints[E]['res']>; + request<E extends keyof Endpoints, P extends Endpoints[E]["req"]>( + endpoint: E, + params?: P, + credential?: string | null | undefined, + ): Promise< + Endpoints[E]["res"] extends { + $switch: { + $cases: [any, any][]; + $default: any; + }; + } + ? IsCaseMatched<E, P, 0> extends true + ? GetCaseResult<E, P, 0> + : IsCaseMatched<E, P, 1> extends true + ? GetCaseResult<E, P, 1> + : IsCaseMatched<E, P, 2> extends true + ? GetCaseResult<E, P, 2> + : IsCaseMatched<E, P, 3> extends true + ? GetCaseResult<E, P, 3> + : IsCaseMatched<E, P, 4> extends true + ? GetCaseResult<E, P, 4> + : IsCaseMatched<E, P, 5> extends true + ? GetCaseResult<E, P, 5> + : IsCaseMatched<E, P, 6> extends true + ? GetCaseResult<E, P, 6> + : IsCaseMatched<E, P, 7> extends true + ? GetCaseResult<E, P, 7> + : IsCaseMatched<E, P, 8> extends true + ? GetCaseResult<E, P, 8> + : IsCaseMatched<E, P, 9> extends true + ? GetCaseResult<E, P, 9> + : Endpoints[E]["res"]["$switch"]["$default"] + : Endpoints[E]["res"] + >; } // @public (undocumented) type APIError = { - id: string; - code: string; - message: string; - kind: 'client' | 'server'; - info: Record<string, any>; + id: string; + code: string; + message: string; + kind: "client" | "server"; + info: Record<string, any>; }; // @public (undocumented) @@ -95,169 +124,183 @@ type App = TODO_2; // @public (undocumented) type AuthSession = { - id: ID; - app: App; - token: string; + id: ID; + app: App; + token: string; }; // @public (undocumented) type Blocking = { - id: ID; - createdAt: DateString; - blockeeId: User['id']; - blockee: UserDetailed; + id: ID; + createdAt: DateString; + blockeeId: User["id"]; + blockee: UserDetailed; }; // @public (undocumented) type Channel = { - id: ID; + id: ID; }; // Warning: (ae-forgotten-export) The symbol "AnyOf" needs to be exported by the entry point index.d.ts // // @public (undocumented) -export abstract class ChannelConnection<Channel extends AnyOf<Channels> = any> extends EventEmitter<Channel['events']> { - constructor(stream: Stream, channel: string, name?: string); - // (undocumented) +export abstract class ChannelConnection< + Channel extends AnyOf<Channels> = any, +> extends EventEmitter<Channel["events"]> { + constructor(stream: Stream, channel: string, name?: string); + // (undocumented) channel: string; - // (undocumented) + // (undocumented) abstract dispose(): void; - // (undocumented) + // (undocumented) abstract id: string; - // (undocumented) + // (undocumented) inCount: number; - // (undocumented) + // (undocumented) name?: string; - // (undocumented) + // (undocumented) outCount: number; - // (undocumented) - send<T extends keyof Channel['receives']>(type: T, body: Channel['receives'][T]): void; - // (undocumented) + // (undocumented) + send<T extends keyof Channel["receives"]>( + type: T, + body: Channel["receives"][T], + ): void; + // (undocumented) protected stream: Stream; } // @public (undocumented) export type Channels = { - main: { - params: null; - events: { - notification: (payload: Notification_2) => void; - mention: (payload: Note) => void; - reply: (payload: Note) => void; - renote: (payload: Note) => void; - follow: (payload: User) => void; - followed: (payload: User) => void; - unfollow: (payload: User) => void; - meUpdated: (payload: MeDetailed) => void; - pageEvent: (payload: PageEvent) => void; - urlUploadFinished: (payload: { - marker: string; - file: DriveFile; - }) => void; - readAllNotifications: () => void; - unreadNotification: (payload: Notification_2) => void; - unreadMention: (payload: Note['id']) => void; - readAllUnreadMentions: () => void; - unreadSpecifiedNote: (payload: Note['id']) => void; - readAllUnreadSpecifiedNotes: () => void; - readAllMessagingMessages: () => void; - messagingMessage: (payload: MessagingMessage) => void; - unreadMessagingMessage: (payload: MessagingMessage) => void; - readAllAntennas: () => void; - unreadAntenna: (payload: Antenna) => void; - readAllAnnouncements: () => void; - readAllChannels: () => void; - unreadChannel: (payload: Note['id']) => void; - myTokenRegenerated: () => void; - reversiNoInvites: () => void; - reversiInvited: (payload: FIXME) => void; - signin: (payload: FIXME) => void; - registryUpdated: (payload: { - scope?: string[]; - key: string; - value: any | null; - }) => void; - driveFileCreated: (payload: DriveFile) => void; - readAntenna: (payload: Antenna) => void; - }; - receives: null; - }; - homeTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - localTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - hybridTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - recommendedTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - globalTimeline: { - params: null; - events: { - note: (payload: Note) => void; - }; - receives: null; - }; - messaging: { - params: { - otherparty?: User['id'] | null; - group?: UserGroup['id'] | null; - }; - events: { - message: (payload: MessagingMessage) => void; - deleted: (payload: MessagingMessage['id']) => void; - read: (payload: MessagingMessage['id'][]) => void; - typers: (payload: User[]) => void; - }; - receives: { - read: { - id: MessagingMessage['id']; - }; - }; - }; - serverStats: { - params: null; - events: { - stats: (payload: FIXME) => void; - }; - receives: { - requestLog: { - id: string | number; - length: number; - }; - }; - }; - queueStats: { - params: null; - events: { - stats: (payload: FIXME) => void; - }; - receives: { - requestLog: { - id: string | number; - length: number; - }; - }; - }; + main: { + params: null; + events: { + notification: (payload: Notification_2) => void; + mention: (payload: Note) => void; + reply: (payload: Note) => void; + renote: (payload: Note) => void; + follow: (payload: User) => void; + followed: (payload: User) => void; + unfollow: (payload: User) => void; + meUpdated: (payload: MeDetailed) => void; + pageEvent: (payload: PageEvent) => void; + urlUploadFinished: (payload: { + marker: string; + file: DriveFile; + }) => void; + readAllNotifications: () => void; + unreadNotification: (payload: Notification_2) => void; + unreadMention: (payload: Note["id"]) => void; + readAllUnreadMentions: () => void; + unreadSpecifiedNote: (payload: Note["id"]) => void; + readAllUnreadSpecifiedNotes: () => void; + readAllMessagingMessages: () => void; + messagingMessage: (payload: MessagingMessage) => void; + unreadMessagingMessage: (payload: MessagingMessage) => void; + readAllAntennas: () => void; + unreadAntenna: (payload: Antenna) => void; + readAllAnnouncements: () => void; + readAllChannels: () => void; + unreadChannel: (payload: Note["id"]) => void; + myTokenRegenerated: () => void; + reversiNoInvites: () => void; + reversiInvited: (payload: FIXME) => void; + signin: (payload: FIXME) => void; + registryUpdated: (payload: { + scope?: string[]; + key: string; + value: any | null; + }) => void; + driveFileCreated: (payload: DriveFile) => void; + readAntenna: (payload: Antenna) => void; + }; + receives: null; + }; + homeTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + localTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + hybridTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + recommendedTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + globalTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + messaging: { + params: { + otherparty?: User["id"] | null; + group?: UserGroup["id"] | null; + }; + events: { + message: (payload: MessagingMessage) => void; + deleted: (payload: MessagingMessage["id"]) => void; + read: (payload: MessagingMessage["id"][]) => void; + typers: (payload: User[]) => void; + }; + receives: { + read: { + id: MessagingMessage["id"]; + }; + }; + }; + serverStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; + queueStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; }; // @public (undocumented) @@ -265,11 +308,11 @@ type Clip = TODO_2; // @public (undocumented) type CustomEmoji = { - id: string; - name: string; - url: string; - category: string; - aliases: string[]; + id: string; + name: string; + url: string; + category: string; + aliases: string[]; }; // @public (undocumented) @@ -277,23 +320,23 @@ type DateString = string; // @public (undocumented) type DetailedInstanceMetadata = LiteInstanceMetadata & { - features: Record<string, any>; + features: Record<string, any>; }; // @public (undocumented) type DriveFile = { - id: ID; - createdAt: DateString; - isSensitive: boolean; - name: string; - thumbnailUrl: string; - url: string; - type: string; - size: number; - md5: string; - blurhash: string; - comment: string | null; - properties: Record<string, any>; + id: ID; + createdAt: DateString; + isSensitive: boolean; + name: string; + thumbnailUrl: string; + url: string; + type: string; + size: number; + md5: string; + blurhash: string; + comment: string | null; + properties: Record<string, any>; }; // @public (undocumented) @@ -301,1862 +344,1903 @@ type DriveFolder = TODO_2; // @public (undocumented) export type Endpoints = { - 'admin/abuse-user-reports': { - req: TODO; - res: TODO; - }; - 'admin/delete-all-files-of-a-user': { - req: { - userId: User['id']; - }; - res: null; - }; - 'admin/delete-logs': { - req: NoParams; - res: null; - }; - 'admin/get-index-stats': { - req: TODO; - res: TODO; - }; - 'admin/get-table-stats': { - req: TODO; - res: TODO; - }; - 'admin/invite': { - req: TODO; - res: TODO; - }; - 'admin/logs': { - req: TODO; - res: TODO; - }; - 'admin/reset-password': { - req: TODO; - res: TODO; - }; - 'admin/resolve-abuse-user-report': { - req: TODO; - res: TODO; - }; - 'admin/resync-chart': { - req: TODO; - res: TODO; - }; - 'admin/send-email': { - req: TODO; - res: TODO; - }; - 'admin/server-info': { - req: TODO; - res: TODO; - }; - 'admin/show-moderation-logs': { - req: TODO; - res: TODO; - }; - 'admin/show-user': { - req: TODO; - res: TODO; - }; - 'admin/show-users': { - req: TODO; - res: TODO; - }; - 'admin/silence-user': { - req: TODO; - res: TODO; - }; - 'admin/suspend-user': { - req: TODO; - res: TODO; - }; - 'admin/unsilence-user': { - req: TODO; - res: TODO; - }; - 'admin/unsuspend-user': { - req: TODO; - res: TODO; - }; - 'admin/update-meta': { - req: TODO; - res: TODO; - }; - 'admin/vacuum': { - req: TODO; - res: TODO; - }; - 'admin/accounts/create': { - req: TODO; - res: TODO; - }; - 'admin/ad/create': { - req: TODO; - res: TODO; - }; - 'admin/ad/delete': { - req: { - id: Ad['id']; - }; - res: null; - }; - 'admin/ad/list': { - req: TODO; - res: TODO; - }; - 'admin/ad/update': { - req: TODO; - res: TODO; - }; - 'admin/announcements/create': { - req: TODO; - res: TODO; - }; - 'admin/announcements/delete': { - req: { - id: Announcement['id']; - }; - res: null; - }; - 'admin/announcements/list': { - req: TODO; - res: TODO; - }; - 'admin/announcements/update': { - req: TODO; - res: TODO; - }; - 'admin/drive/clean-remote-files': { - req: TODO; - res: TODO; - }; - 'admin/drive/cleanup': { - req: TODO; - res: TODO; - }; - 'admin/drive/files': { - req: TODO; - res: TODO; - }; - 'admin/drive/show-file': { - req: TODO; - res: TODO; - }; - 'admin/emoji/add': { - req: TODO; - res: TODO; - }; - 'admin/emoji/copy': { - req: TODO; - res: TODO; - }; - 'admin/emoji/list-remote': { - req: TODO; - res: TODO; - }; - 'admin/emoji/list': { - req: TODO; - res: TODO; - }; - 'admin/emoji/remove': { - req: TODO; - res: TODO; - }; - 'admin/emoji/update': { - req: TODO; - res: TODO; - }; - 'admin/federation/delete-all-files': { - req: { - host: string; - }; - res: null; - }; - 'admin/federation/refresh-remote-instance-metadata': { - req: TODO; - res: TODO; - }; - 'admin/federation/remove-all-following': { - req: TODO; - res: TODO; - }; - 'admin/federation/update-instance': { - req: TODO; - res: TODO; - }; - 'admin/moderators/add': { - req: TODO; - res: TODO; - }; - 'admin/moderators/remove': { - req: TODO; - res: TODO; - }; - 'admin/promo/create': { - req: TODO; - res: TODO; - }; - 'admin/queue/clear': { - req: TODO; - res: TODO; - }; - 'admin/queue/deliver-delayed': { - req: TODO; - res: TODO; - }; - 'admin/queue/inbox-delayed': { - req: TODO; - res: TODO; - }; - 'admin/queue/jobs': { - req: TODO; - res: TODO; - }; - 'admin/queue/stats': { - req: TODO; - res: TODO; - }; - 'admin/relays/add': { - req: TODO; - res: TODO; - }; - 'admin/relays/list': { - req: TODO; - res: TODO; - }; - 'admin/relays/remove': { - req: TODO; - res: TODO; - }; - 'announcements': { - req: { - limit?: number; - withUnreads?: boolean; - sinceId?: Announcement['id']; - untilId?: Announcement['id']; - }; - res: Announcement[]; - }; - 'antennas/create': { - req: TODO; - res: Antenna; - }; - 'antennas/delete': { - req: { - antennaId: Antenna['id']; - }; - res: null; - }; - 'antennas/list': { - req: NoParams; - res: Antenna[]; - }; - 'antennas/notes': { - req: { - antennaId: Antenna['id']; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - }; - res: Note[]; - }; - 'antennas/show': { - req: { - antennaId: Antenna['id']; - }; - res: Antenna; - }; - 'antennas/update': { - req: TODO; - res: Antenna; - }; - 'ap/get': { - req: { - uri: string; - }; - res: Record<string, any>; - }; - 'ap/show': { - req: { - uri: string; - }; - res: { - type: 'Note'; - object: Note; - } | { - type: 'User'; - object: UserDetailed; - }; - }; - 'app/create': { - req: TODO; - res: App; - }; - 'app/show': { - req: { - appId: App['id']; - }; - res: App; - }; - 'auth/accept': { - req: { - token: string; - }; - res: null; - }; - 'auth/session/generate': { - req: { - appSecret: string; - }; - res: { - token: string; - url: string; - }; - }; - 'auth/session/show': { - req: { - token: string; - }; - res: AuthSession; - }; - 'auth/session/userkey': { - req: { - appSecret: string; - token: string; - }; - res: { - accessToken: string; - user: User; - }; - }; - 'blocking/create': { - req: { - userId: User['id']; - }; - res: UserDetailed; - }; - 'blocking/delete': { - req: { - userId: User['id']; - }; - res: UserDetailed; - }; - 'blocking/list': { - req: { - limit?: number; - sinceId?: Blocking['id']; - untilId?: Blocking['id']; - }; - res: Blocking[]; - }; - 'channels/create': { - req: TODO; - res: TODO; - }; - 'channels/featured': { - req: TODO; - res: TODO; - }; - 'channels/follow': { - req: TODO; - res: TODO; - }; - 'channels/followed': { - req: TODO; - res: TODO; - }; - 'channels/owned': { - req: TODO; - res: TODO; - }; - 'channels/pin-note': { - req: TODO; - res: TODO; - }; - 'channels/show': { - req: TODO; - res: TODO; - }; - 'channels/timeline': { - req: TODO; - res: TODO; - }; - 'channels/unfollow': { - req: TODO; - res: TODO; - }; - 'channels/update': { - req: TODO; - res: TODO; - }; - 'charts/active-users': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - local: { - users: number[]; - }; - remote: { - users: number[]; - }; - }; - }; - 'charts/drive': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - local: { - decCount: number[]; - decSize: number[]; - incCount: number[]; - incSize: number[]; - totalCount: number[]; - totalSize: number[]; - }; - remote: { - decCount: number[]; - decSize: number[]; - incCount: number[]; - incSize: number[]; - totalCount: number[]; - totalSize: number[]; - }; - }; - }; - 'charts/federation': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - instance: { - dec: number[]; - inc: number[]; - total: number[]; - }; - }; - }; - 'charts/hashtag': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: TODO; - }; - 'charts/instance': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - host: string; - }; - res: { - drive: { - decFiles: number[]; - decUsage: number[]; - incFiles: number[]; - incUsage: number[]; - totalFiles: number[]; - totalUsage: number[]; - }; - followers: { - dec: number[]; - inc: number[]; - total: number[]; - }; - following: { - dec: number[]; - inc: number[]; - total: number[]; - }; - notes: { - dec: number[]; - inc: number[]; - total: number[]; - diffs: { - normal: number[]; - renote: number[]; - reply: number[]; - }; - }; - requests: { - failed: number[]; - received: number[]; - succeeded: number[]; - }; - users: { - dec: number[]; - inc: number[]; - total: number[]; - }; - }; - }; - 'charts/network': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: TODO; - }; - 'charts/notes': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - local: { - dec: number[]; - inc: number[]; - total: number[]; - diffs: { - normal: number[]; - renote: number[]; - reply: number[]; - }; - }; - remote: { - dec: number[]; - inc: number[]; - total: number[]; - diffs: { - normal: number[]; - renote: number[]; - reply: number[]; - }; - }; - }; - }; - 'charts/user/drive': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - userId: User['id']; - }; - res: { - decCount: number[]; - decSize: number[]; - incCount: number[]; - incSize: number[]; - totalCount: number[]; - totalSize: number[]; - }; - }; - 'charts/user/following': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - userId: User['id']; - }; - res: TODO; - }; - 'charts/user/notes': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - userId: User['id']; - }; - res: { - dec: number[]; - inc: number[]; - total: number[]; - diffs: { - normal: number[]; - renote: number[]; - reply: number[]; - }; - }; - }; - 'charts/user/reactions': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - userId: User['id']; - }; - res: TODO; - }; - 'charts/users': { - req: { - span: 'day' | 'hour'; - limit?: number; - offset?: number | null; - }; - res: { - local: { - dec: number[]; - inc: number[]; - total: number[]; - }; - remote: { - dec: number[]; - inc: number[]; - total: number[]; - }; - }; - }; - 'clips/add-note': { - req: TODO; - res: TODO; - }; - 'clips/create': { - req: TODO; - res: TODO; - }; - 'clips/delete': { - req: { - clipId: Clip['id']; - }; - res: null; - }; - 'clips/list': { - req: TODO; - res: TODO; - }; - 'clips/notes': { - req: TODO; - res: TODO; - }; - 'clips/show': { - req: TODO; - res: TODO; - }; - 'clips/update': { - req: TODO; - res: TODO; - }; - 'drive': { - req: NoParams; - res: { - capacity: number; - usage: number; - }; - }; - 'drive/files': { - req: { - folderId?: DriveFolder['id'] | null; - type?: DriveFile['type'] | null; - limit?: number; - sinceId?: DriveFile['id']; - untilId?: DriveFile['id']; - }; - res: DriveFile[]; - }; - 'drive/files/attached-notes': { - req: TODO; - res: TODO; - }; - 'drive/files/check-existence': { - req: TODO; - res: TODO; - }; - 'drive/files/create': { - req: TODO; - res: TODO; - }; - 'drive/files/delete': { - req: { - fileId: DriveFile['id']; - }; - res: null; - }; - 'drive/files/find-by-hash': { - req: TODO; - res: TODO; - }; - 'drive/files/find': { - req: { - name: string; - folderId?: DriveFolder['id'] | null; - }; - res: DriveFile[]; - }; - 'drive/files/show': { - req: { - fileId?: DriveFile['id']; - url?: string; - }; - res: DriveFile; - }; - 'drive/files/update': { - req: { - fileId: DriveFile['id']; - folderId?: DriveFolder['id'] | null; - name?: string; - isSensitive?: boolean; - comment?: string | null; - }; - res: DriveFile; - }; - 'drive/files/upload-from-url': { - req: { - url: string; - folderId?: DriveFolder['id'] | null; - isSensitive?: boolean; - comment?: string | null; - marker?: string | null; - force?: boolean; - }; - res: null; - }; - 'drive/folders': { - req: { - folderId?: DriveFolder['id'] | null; - limit?: number; - sinceId?: DriveFile['id']; - untilId?: DriveFile['id']; - }; - res: DriveFolder[]; - }; - 'drive/folders/create': { - req: { - name?: string; - parentId?: DriveFolder['id'] | null; - }; - res: DriveFolder; - }; - 'drive/folders/delete': { - req: { - folderId: DriveFolder['id']; - }; - res: null; - }; - 'drive/folders/find': { - req: { - name: string; - parentId?: DriveFolder['id'] | null; - }; - res: DriveFolder[]; - }; - 'drive/folders/show': { - req: { - folderId: DriveFolder['id']; - }; - res: DriveFolder; - }; - 'drive/folders/update': { - req: { - folderId: DriveFolder['id']; - name?: string; - parentId?: DriveFolder['id'] | null; - }; - res: DriveFolder; - }; - 'drive/stream': { - req: { - type?: DriveFile['type'] | null; - limit?: number; - sinceId?: DriveFile['id']; - untilId?: DriveFile['id']; - }; - res: DriveFile[]; - }; - 'endpoint': { - req: { - endpoint: string; - }; - res: { - params: { - name: string; - type: string; - }[]; - }; - }; - 'endpoints': { - req: NoParams; - res: string[]; - }; - 'federation/dns': { - req: { - host: string; - }; - res: { - a: string[]; - aaaa: string[]; - cname: string[]; - txt: string[]; - }; - }; - 'federation/followers': { - req: { - host: string; - limit?: number; - sinceId?: Following['id']; - untilId?: Following['id']; - }; - res: FollowingFolloweePopulated[]; - }; - 'federation/following': { - req: { - host: string; - limit?: number; - sinceId?: Following['id']; - untilId?: Following['id']; - }; - res: FollowingFolloweePopulated[]; - }; - 'federation/instances': { - req: { - host?: string | null; - blocked?: boolean | null; - notResponding?: boolean | null; - suspended?: boolean | null; - federating?: boolean | null; - subscribing?: boolean | null; - publishing?: boolean | null; - limit?: number; - offset?: number; - sort?: '+pubSub' | '-pubSub' | '+notes' | '-notes' | '+users' | '-users' | '+following' | '-following' | '+followers' | '-followers' | '+caughtAt' | '-caughtAt' | '+lastCommunicatedAt' | '-lastCommunicatedAt' | '+driveUsage' | '-driveUsage' | '+driveFiles' | '-driveFiles'; - }; - res: Instance[]; - }; - 'federation/show-instance': { - req: { - host: string; - }; - res: Instance; - }; - 'federation/update-remote-user': { - req: { - userId: User['id']; - }; - res: null; - }; - 'federation/users': { - req: { - host: string; - limit?: number; - sinceId?: User['id']; - untilId?: User['id']; - }; - res: UserDetailed[]; - }; - 'following/create': { - req: { - userId: User['id']; - }; - res: User; - }; - 'following/delete': { - req: { - userId: User['id']; - }; - res: User; - }; - 'following/requests/accept': { - req: { - userId: User['id']; - }; - res: null; - }; - 'following/requests/cancel': { - req: { - userId: User['id']; - }; - res: User; - }; - 'following/requests/list': { - req: NoParams; - res: FollowRequest[]; - }; - 'following/requests/reject': { - req: { - userId: User['id']; - }; - res: null; - }; - 'gallery/featured': { - req: TODO; - res: TODO; - }; - 'gallery/popular': { - req: TODO; - res: TODO; - }; - 'gallery/posts': { - req: TODO; - res: TODO; - }; - 'gallery/posts/create': { - req: TODO; - res: TODO; - }; - 'gallery/posts/delete': { - req: { - postId: GalleryPost['id']; - }; - res: null; - }; - 'gallery/posts/like': { - req: TODO; - res: TODO; - }; - 'gallery/posts/show': { - req: TODO; - res: TODO; - }; - 'gallery/posts/unlike': { - req: TODO; - res: TODO; - }; - 'gallery/posts/update': { - req: TODO; - res: TODO; - }; - 'games/reversi/games': { - req: TODO; - res: TODO; - }; - 'games/reversi/games/show': { - req: TODO; - res: TODO; - }; - 'games/reversi/games/surrender': { - req: TODO; - res: TODO; - }; - 'games/reversi/invitations': { - req: TODO; - res: TODO; - }; - 'games/reversi/match': { - req: TODO; - res: TODO; - }; - 'games/reversi/match/cancel': { - req: TODO; - res: TODO; - }; - 'get-online-users-count': { - req: NoParams; - res: { - count: number; - }; - }; - 'hashtags/list': { - req: TODO; - res: TODO; - }; - 'hashtags/search': { - req: TODO; - res: TODO; - }; - 'hashtags/show': { - req: TODO; - res: TODO; - }; - 'hashtags/trend': { - req: TODO; - res: TODO; - }; - 'hashtags/users': { - req: TODO; - res: TODO; - }; - 'i': { - req: NoParams; - res: User; - }; - 'i/apps': { - req: TODO; - res: TODO; - }; - 'i/authorized-apps': { - req: TODO; - res: TODO; - }; - 'i/change-password': { - req: TODO; - res: TODO; - }; - 'i/delete-account': { - req: { - password: string; - }; - res: null; - }; - 'i/export-blocking': { - req: TODO; - res: TODO; - }; - 'i/export-following': { - req: TODO; - res: TODO; - }; - 'i/export-mute': { - req: TODO; - res: TODO; - }; - 'i/export-notes': { - req: TODO; - res: TODO; - }; - 'i/export-user-lists': { - req: TODO; - res: TODO; - }; - 'i/favorites': { - req: { - limit?: number; - sinceId?: NoteFavorite['id']; - untilId?: NoteFavorite['id']; - }; - res: NoteFavorite[]; - }; - 'i/gallery/likes': { - req: TODO; - res: TODO; - }; - 'i/gallery/posts': { - req: TODO; - res: TODO; - }; - 'i/get-word-muted-notes-count': { - req: TODO; - res: TODO; - }; - 'i/import-following': { - req: TODO; - res: TODO; - }; - 'i/import-user-lists': { - req: TODO; - res: TODO; - }; - 'i/move': { - req: TODO; - res: TODO; - }; - 'i/known-as': { - req: TODO; - res: TODO; - }; - 'i/notifications': { - req: { - limit?: number; - sinceId?: Notification_2['id']; - untilId?: Notification_2['id']; - following?: boolean; - markAsRead?: boolean; - includeTypes?: Notification_2['type'][]; - excludeTypes?: Notification_2['type'][]; - }; - res: Notification_2[]; - }; - 'i/page-likes': { - req: TODO; - res: TODO; - }; - 'i/pages': { - req: TODO; - res: TODO; - }; - 'i/pin': { - req: { - noteId: Note['id']; - }; - res: MeDetailed; - }; - 'i/read-all-messaging-messages': { - req: TODO; - res: TODO; - }; - 'i/read-all-unread-notes': { - req: TODO; - res: TODO; - }; - 'i/read-announcement': { - req: TODO; - res: TODO; - }; - 'i/regenerate-token': { - req: { - password: string; - }; - res: null; - }; - 'i/registry/get-all': { - req: { - scope?: string[]; - }; - res: Record<string, any>; - }; - 'i/registry/get-detail': { - req: { - key: string; - scope?: string[]; - }; - res: { - updatedAt: DateString; - value: any; - }; - }; - 'i/registry/get': { - req: { - key: string; - scope?: string[]; - }; - res: any; - }; - 'i/registry/keys-with-type': { - req: { - scope?: string[]; - }; - res: Record<string, 'null' | 'array' | 'number' | 'string' | 'boolean' | 'object'>; - }; - 'i/registry/keys': { - req: { - scope?: string[]; - }; - res: string[]; - }; - 'i/registry/remove': { - req: { - key: string; - scope?: string[]; - }; - res: null; - }; - 'i/registry/scopes': { - req: NoParams; - res: string[][]; - }; - 'i/registry/set': { - req: { - key: string; - value: any; - scope?: string[]; - }; - res: null; - }; - 'i/revoke-token': { - req: TODO; - res: TODO; - }; - 'i/signin-history': { - req: { - limit?: number; - sinceId?: Signin['id']; - untilId?: Signin['id']; - }; - res: Signin[]; - }; - 'i/unpin': { - req: { - noteId: Note['id']; - }; - res: MeDetailed; - }; - 'i/update-email': { - req: { - password: string; - email?: string | null; - }; - res: MeDetailed; - }; - 'i/update': { - req: { - name?: string | null; - description?: string | null; - lang?: string | null; - location?: string | null; - birthday?: string | null; - avatarId?: DriveFile['id'] | null; - bannerId?: DriveFile['id'] | null; - fields?: { - name: string; - value: string; - }[]; - isLocked?: boolean; - isExplorable?: boolean; - hideOnlineStatus?: boolean; - carefulBot?: boolean; - autoAcceptFollowed?: boolean; - noCrawle?: boolean; - isBot?: boolean; - isCat?: boolean; - injectFeaturedNote?: boolean; - receiveAnnouncementEmail?: boolean; - alwaysMarkNsfw?: boolean; - mutedWords?: string[][]; - mutingNotificationTypes?: Notification_2['type'][]; - emailNotificationTypes?: string[]; - }; - res: MeDetailed; - }; - 'i/user-group-invites': { - req: TODO; - res: TODO; - }; - 'i/2fa/done': { - req: TODO; - res: TODO; - }; - 'i/2fa/key-done': { - req: TODO; - res: TODO; - }; - 'i/2fa/password-less': { - req: TODO; - res: TODO; - }; - 'i/2fa/register-key': { - req: TODO; - res: TODO; - }; - 'i/2fa/register': { - req: TODO; - res: TODO; - }; - 'i/2fa/remove-key': { - req: TODO; - res: TODO; - }; - 'i/2fa/unregister': { - req: TODO; - res: TODO; - }; - 'messaging/history': { - req: { - limit?: number; - group?: boolean; - }; - res: MessagingMessage[]; - }; - 'messaging/messages': { - req: { - userId?: User['id']; - groupId?: UserGroup['id']; - limit?: number; - sinceId?: MessagingMessage['id']; - untilId?: MessagingMessage['id']; - markAsRead?: boolean; - }; - res: MessagingMessage[]; - }; - 'messaging/messages/create': { - req: { - userId?: User['id']; - groupId?: UserGroup['id']; - text?: string; - fileId?: DriveFile['id']; - }; - res: MessagingMessage; - }; - 'messaging/messages/delete': { - req: { - messageId: MessagingMessage['id']; - }; - res: null; - }; - 'messaging/messages/read': { - req: { - messageId: MessagingMessage['id']; - }; - res: null; - }; - 'meta': { - req: { - detail?: boolean; - }; - res: { - $switch: { - $cases: [ - [ - { - detail: true; - }, - DetailedInstanceMetadata - ], - [ - { - detail: false; - }, - LiteInstanceMetadata - ], - [ - { - detail: boolean; - }, - LiteInstanceMetadata | DetailedInstanceMetadata - ] - ]; - $default: LiteInstanceMetadata; - }; - }; - }; - 'miauth/gen-token': { - req: TODO; - res: TODO; - }; - 'mute/create': { - req: TODO; - res: TODO; - }; - 'mute/delete': { - req: { - userId: User['id']; - }; - res: null; - }; - 'mute/list': { - req: TODO; - res: TODO; - }; - 'my/apps': { - req: TODO; - res: TODO; - }; - 'notes': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - }; - res: Note[]; - }; - 'notes/children': { - req: { - noteId: Note['id']; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - }; - res: Note[]; - }; - 'notes/clips': { - req: TODO; - res: TODO; - }; - 'notes/conversation': { - req: TODO; - res: TODO; - }; - 'notes/create': { - req: { - visibility?: 'public' | 'home' | 'followers' | 'specified'; - visibleUserIds?: User['id'][]; - text?: null | string; - cw?: null | string; - viaMobile?: boolean; - localOnly?: boolean; - fileIds?: DriveFile['id'][]; - replyId?: null | Note['id']; - renoteId?: null | Note['id']; - channelId?: null | Channel['id']; - poll?: null | { - choices: string[]; - multiple?: boolean; - expiresAt?: null | number; - expiredAfter?: null | number; - }; - }; - res: { - createdNote: Note; - }; - }; - 'notes/delete': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/favorites/create': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/favorites/delete': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/featured': { - req: TODO; - res: Note[]; - }; - 'notes/global-timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/recommended-timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/hybrid-timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/local-timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/mentions': { - req: { - following?: boolean; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - }; - res: Note[]; - }; - 'notes/polls/recommendation': { - req: TODO; - res: TODO; - }; - 'notes/polls/vote': { - req: { - noteId: Note['id']; - choice: number; - }; - res: null; - }; - 'notes/reactions': { - req: { - noteId: Note['id']; - type?: string | null; - limit?: number; - }; - res: NoteReaction[]; - }; - 'notes/reactions/create': { - req: { - noteId: Note['id']; - reaction: string; - }; - res: null; - }; - 'notes/reactions/delete': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/renotes': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - noteId: Note['id']; - }; - res: Note[]; - }; - 'notes/replies': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - noteId: Note['id']; - }; - res: Note[]; - }; - 'notes/search-by-tag': { - req: TODO; - res: TODO; - }; - 'notes/search': { - req: TODO; - res: TODO; - }; - 'notes/show': { - req: { - noteId: Note['id']; - }; - res: Note; - }; - 'notes/state': { - req: TODO; - res: TODO; - }; - 'notes/timeline': { - req: { - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/unrenote': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notes/user-list-timeline': { - req: { - listId: UserList['id']; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'notes/watching/create': { - req: TODO; - res: TODO; - }; - 'notes/watching/delete': { - req: { - noteId: Note['id']; - }; - res: null; - }; - 'notifications/create': { - req: { - body: string; - header?: string | null; - icon?: string | null; - }; - res: null; - }; - 'notifications/mark-all-as-read': { - req: NoParams; - res: null; - }; - 'notifications/read': { - req: { - notificationId: Notification_2['id']; - }; - res: null; - }; - 'page-push': { - req: { - pageId: Page['id']; - event: string; - var?: any; - }; - res: null; - }; - 'pages/create': { - req: TODO; - res: Page; - }; - 'pages/delete': { - req: { - pageId: Page['id']; - }; - res: null; - }; - 'pages/featured': { - req: NoParams; - res: Page[]; - }; - 'pages/like': { - req: { - pageId: Page['id']; - }; - res: null; - }; - 'pages/show': { - req: { - pageId?: Page['id']; - name?: string; - username?: string; - }; - res: Page; - }; - 'pages/unlike': { - req: { - pageId: Page['id']; - }; - res: null; - }; - 'pages/update': { - req: TODO; - res: null; - }; - 'ping': { - req: NoParams; - res: { - pong: number; - }; - }; - 'pinned-users': { - req: TODO; - res: TODO; - }; - 'promo/read': { - req: TODO; - res: TODO; - }; - 'request-reset-password': { - req: { - username: string; - email: string; - }; - res: null; - }; - 'reset-password': { - req: { - token: string; - password: string; - }; - res: null; - }; - 'room/show': { - req: TODO; - res: TODO; - }; - 'room/update': { - req: TODO; - res: TODO; - }; - 'stats': { - req: NoParams; - res: Stats; - }; - 'server-info': { - req: NoParams; - res: ServerInfo; - }; - 'latest-version': { - req: NoParams; - res: TODO; - }; - 'sw/register': { - req: TODO; - res: TODO; - }; - 'username/available': { - req: { - username: string; - }; - res: { - available: boolean; - }; - }; - 'users': { - req: { - limit?: number; - offset?: number; - sort?: UserSorting; - origin?: OriginType; - }; - res: User[]; - }; - 'users/clips': { - req: TODO; - res: TODO; - }; - 'users/followers': { - req: { - userId?: User['id']; - username?: User['username']; - host?: User['host'] | null; - limit?: number; - sinceId?: Following['id']; - untilId?: Following['id']; - }; - res: FollowingFollowerPopulated[]; - }; - 'users/following': { - req: { - userId?: User['id']; - username?: User['username']; - host?: User['host'] | null; - limit?: number; - sinceId?: Following['id']; - untilId?: Following['id']; - }; - res: FollowingFolloweePopulated[]; - }; - 'users/gallery/posts': { - req: TODO; - res: TODO; - }; - 'users/get-frequently-replied-users': { - req: TODO; - res: TODO; - }; - 'users/groups/create': { - req: TODO; - res: TODO; - }; - 'users/groups/delete': { - req: { - groupId: UserGroup['id']; - }; - res: null; - }; - 'users/groups/invitations/accept': { - req: TODO; - res: TODO; - }; - 'users/groups/invitations/reject': { - req: TODO; - res: TODO; - }; - 'users/groups/invite': { - req: TODO; - res: TODO; - }; - 'users/groups/joined': { - req: TODO; - res: TODO; - }; - 'users/groups/owned': { - req: TODO; - res: TODO; - }; - 'users/groups/pull': { - req: TODO; - res: TODO; - }; - 'users/groups/show': { - req: TODO; - res: TODO; - }; - 'users/groups/transfer': { - req: TODO; - res: TODO; - }; - 'users/groups/update': { - req: TODO; - res: TODO; - }; - 'users/lists/create': { - req: { - name: string; - }; - res: UserList; - }; - 'users/lists/delete': { - req: { - listId: UserList['id']; - }; - res: null; - }; - 'users/lists/list': { - req: NoParams; - res: UserList[]; - }; - 'users/lists/pull': { - req: { - listId: UserList['id']; - userId: User['id']; - }; - res: null; - }; - 'users/lists/push': { - req: { - listId: UserList['id']; - userId: User['id']; - }; - res: null; - }; - 'users/lists/show': { - req: { - listId: UserList['id']; - }; - res: UserList; - }; - 'users/lists/update': { - req: { - listId: UserList['id']; - name: string; - }; - res: UserList; - }; - 'users/notes': { - req: { - userId: User['id']; - limit?: number; - sinceId?: Note['id']; - untilId?: Note['id']; - sinceDate?: number; - untilDate?: number; - }; - res: Note[]; - }; - 'users/pages': { - req: TODO; - res: TODO; - }; - 'users/recommendation': { - req: TODO; - res: TODO; - }; - 'users/relation': { - req: TODO; - res: TODO; - }; - 'users/report-abuse': { - req: TODO; - res: TODO; - }; - 'users/search-by-username-and-host': { - req: TODO; - res: TODO; - }; - 'users/search': { - req: TODO; - res: TODO; - }; - 'users/show': { - req: ShowUserReq | { - userIds: User['id'][]; - }; - res: { - $switch: { - $cases: [ - [ - { - userIds: User['id'][]; - }, - UserDetailed[] - ] - ]; - $default: UserDetailed; - }; - }; - }; - 'users/stats': { - req: TODO; - res: TODO; - }; + "admin/abuse-user-reports": { + req: TODO; + res: TODO; + }; + "admin/delete-all-files-of-a-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "admin/delete-logs": { + req: NoParams; + res: null; + }; + "admin/get-index-stats": { + req: TODO; + res: TODO; + }; + "admin/get-table-stats": { + req: TODO; + res: TODO; + }; + "admin/invite": { + req: TODO; + res: TODO; + }; + "admin/logs": { + req: TODO; + res: TODO; + }; + "admin/meta": { + req: TODO; + res: TODO; + }; + "admin/reset-password": { + req: TODO; + res: TODO; + }; + "admin/resolve-abuse-user-report": { + req: TODO; + res: TODO; + }; + "admin/resync-chart": { + req: TODO; + res: TODO; + }; + "admin/send-email": { + req: TODO; + res: TODO; + }; + "admin/server-info": { + req: TODO; + res: TODO; + }; + "admin/show-moderation-logs": { + req: TODO; + res: TODO; + }; + "admin/show-user": { + req: TODO; + res: TODO; + }; + "admin/show-users": { + req: TODO; + res: TODO; + }; + "admin/silence-user": { + req: TODO; + res: TODO; + }; + "admin/suspend-user": { + req: TODO; + res: TODO; + }; + "admin/unsilence-user": { + req: TODO; + res: TODO; + }; + "admin/unsuspend-user": { + req: TODO; + res: TODO; + }; + "admin/update-meta": { + req: TODO; + res: TODO; + }; + "admin/vacuum": { + req: TODO; + res: TODO; + }; + "admin/accounts/create": { + req: TODO; + res: TODO; + }; + "admin/ad/create": { + req: TODO; + res: TODO; + }; + "admin/ad/delete": { + req: { + id: Ad["id"]; + }; + res: null; + }; + "admin/ad/list": { + req: TODO; + res: TODO; + }; + "admin/ad/update": { + req: TODO; + res: TODO; + }; + "admin/announcements/create": { + req: TODO; + res: TODO; + }; + "admin/announcements/delete": { + req: { + id: Announcement["id"]; + }; + res: null; + }; + "admin/announcements/list": { + req: TODO; + res: TODO; + }; + "admin/announcements/update": { + req: TODO; + res: TODO; + }; + "admin/drive/clean-remote-files": { + req: TODO; + res: TODO; + }; + "admin/drive/cleanup": { + req: TODO; + res: TODO; + }; + "admin/drive/files": { + req: TODO; + res: TODO; + }; + "admin/drive/show-file": { + req: TODO; + res: TODO; + }; + "admin/emoji/add": { + req: TODO; + res: TODO; + }; + "admin/emoji/copy": { + req: TODO; + res: TODO; + }; + "admin/emoji/list-remote": { + req: TODO; + res: TODO; + }; + "admin/emoji/list": { + req: TODO; + res: TODO; + }; + "admin/emoji/remove": { + req: TODO; + res: TODO; + }; + "admin/emoji/update": { + req: TODO; + res: TODO; + }; + "admin/federation/delete-all-files": { + req: { + host: string; + }; + res: null; + }; + "admin/federation/refresh-remote-instance-metadata": { + req: TODO; + res: TODO; + }; + "admin/federation/remove-all-following": { + req: TODO; + res: TODO; + }; + "admin/federation/update-instance": { + req: TODO; + res: TODO; + }; + "admin/moderators/add": { + req: TODO; + res: TODO; + }; + "admin/moderators/remove": { + req: TODO; + res: TODO; + }; + "admin/promo/create": { + req: TODO; + res: TODO; + }; + "admin/queue/clear": { + req: TODO; + res: TODO; + }; + "admin/queue/deliver-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/inbox-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/jobs": { + req: TODO; + res: TODO; + }; + "admin/queue/stats": { + req: TODO; + res: TODO; + }; + "admin/relays/add": { + req: TODO; + res: TODO; + }; + "admin/relays/list": { + req: TODO; + res: TODO; + }; + "admin/relays/remove": { + req: TODO; + res: TODO; + }; + announcements: { + req: { + limit?: number; + withUnreads?: boolean; + sinceId?: Announcement["id"]; + untilId?: Announcement["id"]; + }; + res: Announcement[]; + }; + "antennas/create": { + req: TODO; + res: Antenna; + }; + "antennas/delete": { + req: { + antennaId: Antenna["id"]; + }; + res: null; + }; + "antennas/list": { + req: NoParams; + res: Antenna[]; + }; + "antennas/notes": { + req: { + antennaId: Antenna["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "antennas/show": { + req: { + antennaId: Antenna["id"]; + }; + res: Antenna; + }; + "antennas/update": { + req: TODO; + res: Antenna; + }; + "antennas/mark-read": { + req: TODO; + res: Antenna; + }; + "ap/get": { + req: { + uri: string; + }; + res: Record<string, any>; + }; + "ap/show": { + req: { + uri: string; + }; + res: + | { + type: "Note"; + object: Note; + } + | { + type: "User"; + object: UserDetailed; + }; + }; + "app/create": { + req: TODO; + res: App; + }; + "app/show": { + req: { + appId: App["id"]; + }; + res: App; + }; + "auth/accept": { + req: { + token: string; + }; + res: null; + }; + "auth/session/generate": { + req: { + appSecret: string; + }; + res: { + token: string; + url: string; + }; + }; + "auth/session/show": { + req: { + token: string; + }; + res: AuthSession; + }; + "auth/session/userkey": { + req: { + appSecret: string; + token: string; + }; + res: { + accessToken: string; + user: User; + }; + }; + "blocking/create": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/delete": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/list": { + req: { + limit?: number; + sinceId?: Blocking["id"]; + untilId?: Blocking["id"]; + }; + res: Blocking[]; + }; + "channels/create": { + req: TODO; + res: TODO; + }; + "channels/featured": { + req: TODO; + res: TODO; + }; + "channels/follow": { + req: TODO; + res: TODO; + }; + "channels/followed": { + req: TODO; + res: TODO; + }; + "channels/owned": { + req: TODO; + res: TODO; + }; + "channels/pin-note": { + req: TODO; + res: TODO; + }; + "channels/show": { + req: TODO; + res: TODO; + }; + "channels/timeline": { + req: TODO; + res: TODO; + }; + "channels/unfollow": { + req: TODO; + res: TODO; + }; + "channels/update": { + req: TODO; + res: TODO; + }; + "charts/active-users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + users: number[]; + }; + remote: { + users: number[]; + }; + }; + }; + "charts/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + remote: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + }; + "charts/federation": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + instance: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/hashtag": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/instance": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + host: string; + }; + res: { + drive: { + decFiles: number[]; + decUsage: number[]; + incFiles: number[]; + incUsage: number[]; + totalFiles: number[]; + totalUsage: number[]; + }; + followers: { + dec: number[]; + inc: number[]; + total: number[]; + }; + following: { + dec: number[]; + inc: number[]; + total: number[]; + }; + notes: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + requests: { + failed: number[]; + received: number[]; + succeeded: number[]; + }; + users: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/network": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + }; + "charts/user/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + "charts/user/following": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/user/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + "charts/user/reactions": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "clips/add-note": { + req: TODO; + res: TODO; + }; + "clips/create": { + req: TODO; + res: TODO; + }; + "clips/delete": { + req: { + clipId: Clip["id"]; + }; + res: null; + }; + "clips/list": { + req: TODO; + res: TODO; + }; + "clips/notes": { + req: TODO; + res: TODO; + }; + "clips/show": { + req: TODO; + res: TODO; + }; + "clips/update": { + req: TODO; + res: TODO; + }; + drive: { + req: NoParams; + res: { + capacity: number; + usage: number; + }; + }; + "drive/files": { + req: { + folderId?: DriveFolder["id"] | null; + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + "drive/files/attached-notes": { + req: TODO; + res: TODO; + }; + "drive/files/check-existence": { + req: TODO; + res: TODO; + }; + "drive/files/create": { + req: TODO; + res: TODO; + }; + "drive/files/delete": { + req: { + fileId: DriveFile["id"]; + }; + res: null; + }; + "drive/files/find-by-hash": { + req: TODO; + res: TODO; + }; + "drive/files/find": { + req: { + name: string; + folderId?: DriveFolder["id"] | null; + }; + res: DriveFile[]; + }; + "drive/files/show": { + req: { + fileId?: DriveFile["id"]; + url?: string; + }; + res: DriveFile; + }; + "drive/files/update": { + req: { + fileId: DriveFile["id"]; + folderId?: DriveFolder["id"] | null; + name?: string; + isSensitive?: boolean; + comment?: string | null; + }; + res: DriveFile; + }; + "drive/files/upload-from-url": { + req: { + url: string; + folderId?: DriveFolder["id"] | null; + isSensitive?: boolean; + comment?: string | null; + marker?: string | null; + force?: boolean; + }; + res: null; + }; + "drive/folders": { + req: { + folderId?: DriveFolder["id"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFolder[]; + }; + "drive/folders/create": { + req: { + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/folders/delete": { + req: { + folderId: DriveFolder["id"]; + }; + res: null; + }; + "drive/folders/find": { + req: { + name: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder[]; + }; + "drive/folders/show": { + req: { + folderId: DriveFolder["id"]; + }; + res: DriveFolder; + }; + "drive/folders/update": { + req: { + folderId: DriveFolder["id"]; + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/stream": { + req: { + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + endpoint: { + req: { + endpoint: string; + }; + res: { + params: { + name: string; + type: string; + }[]; + }; + }; + endpoints: { + req: NoParams; + res: string[]; + }; + "federation/dns": { + req: { + host: string; + }; + res: { + a: string[]; + aaaa: string[]; + cname: string[]; + txt: string[]; + }; + }; + "federation/followers": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/following": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/instances": { + req: { + host?: string | null; + blocked?: boolean | null; + notResponding?: boolean | null; + suspended?: boolean | null; + federating?: boolean | null; + subscribing?: boolean | null; + publishing?: boolean | null; + limit?: number; + offset?: number; + sort?: + | "+pubSub" + | "-pubSub" + | "+notes" + | "-notes" + | "+users" + | "-users" + | "+following" + | "-following" + | "+followers" + | "-followers" + | "+caughtAt" + | "-caughtAt" + | "+lastCommunicatedAt" + | "-lastCommunicatedAt" + | "+driveUsage" + | "-driveUsage" + | "+driveFiles" + | "-driveFiles"; + }; + res: Instance[]; + }; + "federation/show-instance": { + req: { + host: string; + }; + res: Instance; + }; + "federation/update-remote-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "federation/users": { + req: { + host: string; + limit?: number; + sinceId?: User["id"]; + untilId?: User["id"]; + }; + res: UserDetailed[]; + }; + "following/create": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/delete": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/accept": { + req: { + userId: User["id"]; + }; + res: null; + }; + "following/requests/cancel": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/list": { + req: NoParams; + res: FollowRequest[]; + }; + "following/requests/reject": { + req: { + userId: User["id"]; + }; + res: null; + }; + "gallery/featured": { + req: TODO; + res: TODO; + }; + "gallery/popular": { + req: TODO; + res: TODO; + }; + "gallery/posts": { + req: TODO; + res: TODO; + }; + "gallery/posts/create": { + req: TODO; + res: TODO; + }; + "gallery/posts/delete": { + req: { + postId: GalleryPost["id"]; + }; + res: null; + }; + "gallery/posts/like": { + req: TODO; + res: TODO; + }; + "gallery/posts/show": { + req: TODO; + res: TODO; + }; + "gallery/posts/unlike": { + req: TODO; + res: TODO; + }; + "gallery/posts/update": { + req: TODO; + res: TODO; + }; + "games/reversi/games": { + req: TODO; + res: TODO; + }; + "games/reversi/games/show": { + req: TODO; + res: TODO; + }; + "games/reversi/games/surrender": { + req: TODO; + res: TODO; + }; + "games/reversi/invitations": { + req: TODO; + res: TODO; + }; + "games/reversi/match": { + req: TODO; + res: TODO; + }; + "games/reversi/match/cancel": { + req: TODO; + res: TODO; + }; + "get-online-users-count": { + req: NoParams; + res: { + count: number; + }; + }; + "hashtags/list": { + req: TODO; + res: TODO; + }; + "hashtags/search": { + req: TODO; + res: TODO; + }; + "hashtags/show": { + req: TODO; + res: TODO; + }; + "hashtags/trend": { + req: TODO; + res: TODO; + }; + "hashtags/users": { + req: TODO; + res: TODO; + }; + i: { + req: NoParams; + res: User; + }; + "i/apps": { + req: TODO; + res: TODO; + }; + "i/authorized-apps": { + req: TODO; + res: TODO; + }; + "i/change-password": { + req: TODO; + res: TODO; + }; + "i/delete-account": { + req: { + password: string; + }; + res: null; + }; + "i/export-blocking": { + req: TODO; + res: TODO; + }; + "i/export-following": { + req: TODO; + res: TODO; + }; + "i/export-mute": { + req: TODO; + res: TODO; + }; + "i/export-notes": { + req: TODO; + res: TODO; + }; + "i/export-user-lists": { + req: TODO; + res: TODO; + }; + "i/favorites": { + req: { + limit?: number; + sinceId?: NoteFavorite["id"]; + untilId?: NoteFavorite["id"]; + }; + res: NoteFavorite[]; + }; + "i/gallery/likes": { + req: TODO; + res: TODO; + }; + "i/gallery/posts": { + req: TODO; + res: TODO; + }; + "i/get-word-muted-notes-count": { + req: TODO; + res: TODO; + }; + "i/import-following": { + req: TODO; + res: TODO; + }; + "i/import-user-lists": { + req: TODO; + res: TODO; + }; + "i/move": { + req: TODO; + res: TODO; + }; + "i/known-as": { + req: TODO; + res: TODO; + }; + "i/notifications": { + req: { + limit?: number; + sinceId?: Notification_2["id"]; + untilId?: Notification_2["id"]; + following?: boolean; + markAsRead?: boolean; + includeTypes?: Notification_2["type"][]; + excludeTypes?: Notification_2["type"][]; + }; + res: Notification_2[]; + }; + "i/page-likes": { + req: TODO; + res: TODO; + }; + "i/pages": { + req: TODO; + res: TODO; + }; + "i/pin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/read-all-messaging-messages": { + req: TODO; + res: TODO; + }; + "i/read-all-unread-notes": { + req: TODO; + res: TODO; + }; + "i/read-announcement": { + req: TODO; + res: TODO; + }; + "i/regenerate-token": { + req: { + password: string; + }; + res: null; + }; + "i/registry/get-all": { + req: { + scope?: string[]; + }; + res: Record<string, any>; + }; + "i/registry/get-detail": { + req: { + key: string; + scope?: string[]; + }; + res: { + updatedAt: DateString; + value: any; + }; + }; + "i/registry/get": { + req: { + key: string; + scope?: string[]; + }; + res: any; + }; + "i/registry/keys-with-type": { + req: { + scope?: string[]; + }; + res: Record< + string, + "null" | "array" | "number" | "string" | "boolean" | "object" + >; + }; + "i/registry/keys": { + req: { + scope?: string[]; + }; + res: string[]; + }; + "i/registry/remove": { + req: { + key: string; + scope?: string[]; + }; + res: null; + }; + "i/registry/scopes": { + req: NoParams; + res: string[][]; + }; + "i/registry/set": { + req: { + key: string; + value: any; + scope?: string[]; + }; + res: null; + }; + "i/revoke-token": { + req: TODO; + res: TODO; + }; + "i/signin-history": { + req: { + limit?: number; + sinceId?: Signin["id"]; + untilId?: Signin["id"]; + }; + res: Signin[]; + }; + "i/unpin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/update-email": { + req: { + password: string; + email?: string | null; + }; + res: MeDetailed; + }; + "i/update": { + req: { + name?: string | null; + description?: string | null; + lang?: string | null; + location?: string | null; + birthday?: string | null; + avatarId?: DriveFile["id"] | null; + bannerId?: DriveFile["id"] | null; + fields?: { + name: string; + value: string; + }[]; + isLocked?: boolean; + isExplorable?: boolean; + hideOnlineStatus?: boolean; + carefulBot?: boolean; + autoAcceptFollowed?: boolean; + noCrawle?: boolean; + preventAiLearning?: boolean; + isBot?: boolean; + isCat?: boolean; + injectFeaturedNote?: boolean; + receiveAnnouncementEmail?: boolean; + alwaysMarkNsfw?: boolean; + mutedWords?: string[][]; + mutingNotificationTypes?: Notification_2["type"][]; + emailNotificationTypes?: string[]; + }; + res: MeDetailed; + }; + "i/user-group-invites": { + req: TODO; + res: TODO; + }; + "i/2fa/done": { + req: TODO; + res: TODO; + }; + "i/2fa/key-done": { + req: TODO; + res: TODO; + }; + "i/2fa/password-less": { + req: TODO; + res: TODO; + }; + "i/2fa/register-key": { + req: TODO; + res: TODO; + }; + "i/2fa/register": { + req: TODO; + res: TODO; + }; + "i/2fa/update-key": { + req: TODO; + res: TODO; + }; + "i/2fa/remove-key": { + req: TODO; + res: TODO; + }; + "i/2fa/unregister": { + req: TODO; + res: TODO; + }; + "messaging/history": { + req: { + limit?: number; + group?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + limit?: number; + sinceId?: MessagingMessage["id"]; + untilId?: MessagingMessage["id"]; + markAsRead?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages/create": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + text?: string; + fileId?: DriveFile["id"]; + }; + res: MessagingMessage; + }; + "messaging/messages/delete": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + "messaging/messages/read": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + meta: { + req: { + detail?: boolean; + }; + res: { + $switch: { + $cases: [ + [ + { + detail: true; + }, + DetailedInstanceMetadata, + ], + [ + { + detail: false; + }, + LiteInstanceMetadata, + ], + [ + { + detail: boolean; + }, + LiteInstanceMetadata | DetailedInstanceMetadata, + ], + ]; + $default: LiteInstanceMetadata; + }; + }; + }; + "miauth/gen-token": { + req: TODO; + res: TODO; + }; + "mute/create": { + req: TODO; + res: TODO; + }; + "mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "mute/list": { + req: TODO; + res: TODO; + }; + "renote-mute/create": { + req: TODO; + res: TODO; + }; + "renote-mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "renote-mute/list": { + req: TODO; + res: TODO; + }; + "my/apps": { + req: TODO; + res: TODO; + }; + notes: { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/children": { + req: { + noteId: Note["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/clips": { + req: TODO; + res: TODO; + }; + "notes/conversation": { + req: TODO; + res: TODO; + }; + "notes/create": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/edit": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/favorites/create": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/favorites/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/featured": { + req: TODO; + res: Note[]; + }; + "notes/global-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/recommended-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/hybrid-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/local-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/mentions": { + req: { + following?: boolean; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/polls/recommendation": { + req: TODO; + res: TODO; + }; + "notes/polls/vote": { + req: { + noteId: Note["id"]; + choice: number; + }; + res: null; + }; + "notes/reactions": { + req: { + noteId: Note["id"]; + type?: string | null; + limit?: number; + }; + res: NoteReaction[]; + }; + "notes/reactions/create": { + req: { + noteId: Note["id"]; + reaction: string; + }; + res: null; + }; + "notes/reactions/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/renotes": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/replies": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/search-by-tag": { + req: TODO; + res: TODO; + }; + "notes/search": { + req: TODO; + res: TODO; + }; + "notes/show": { + req: { + noteId: Note["id"]; + }; + res: Note; + }; + "notes/state": { + req: TODO; + res: TODO; + }; + "notes/timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/unrenote": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/user-list-timeline": { + req: { + listId: UserList["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/watching/create": { + req: TODO; + res: TODO; + }; + "notes/watching/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notifications/create": { + req: { + body: string; + header?: string | null; + icon?: string | null; + }; + res: null; + }; + "notifications/mark-all-as-read": { + req: NoParams; + res: null; + }; + "notifications/read": { + req: { + notificationId: Notification_2["id"]; + }; + res: null; + }; + "page-push": { + req: { + pageId: Page["id"]; + event: string; + var?: any; + }; + res: null; + }; + "pages/create": { + req: TODO; + res: Page; + }; + "pages/delete": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/featured": { + req: NoParams; + res: Page[]; + }; + "pages/like": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/show": { + req: { + pageId?: Page["id"]; + name?: string; + username?: string; + }; + res: Page; + }; + "pages/unlike": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/update": { + req: TODO; + res: null; + }; + ping: { + req: NoParams; + res: { + pong: number; + }; + }; + "pinned-users": { + req: TODO; + res: TODO; + }; + "promo/read": { + req: TODO; + res: TODO; + }; + "request-reset-password": { + req: { + username: string; + email: string; + }; + res: null; + }; + "reset-password": { + req: { + token: string; + password: string; + }; + res: null; + }; + "room/show": { + req: TODO; + res: TODO; + }; + "room/update": { + req: TODO; + res: TODO; + }; + stats: { + req: NoParams; + res: Stats; + }; + "server-info": { + req: NoParams; + res: ServerInfo; + }; + "latest-version": { + req: NoParams; + res: TODO; + }; + "sw/register": { + req: TODO; + res: TODO; + }; + "username/available": { + req: { + username: string; + }; + res: { + available: boolean; + }; + }; + users: { + req: { + limit?: number; + offset?: number; + sort?: UserSorting; + origin?: OriginType; + }; + res: User[]; + }; + "users/clips": { + req: TODO; + res: TODO; + }; + "users/followers": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFollowerPopulated[]; + }; + "users/following": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "users/gallery/posts": { + req: TODO; + res: TODO; + }; + "users/get-frequently-replied-users": { + req: TODO; + res: TODO; + }; + "users/groups/create": { + req: TODO; + res: TODO; + }; + "users/groups/delete": { + req: { + groupId: UserGroup["id"]; + }; + res: null; + }; + "users/groups/invitations/accept": { + req: TODO; + res: TODO; + }; + "users/groups/invitations/reject": { + req: TODO; + res: TODO; + }; + "users/groups/invite": { + req: TODO; + res: TODO; + }; + "users/groups/joined": { + req: TODO; + res: TODO; + }; + "users/groups/owned": { + req: TODO; + res: TODO; + }; + "users/groups/pull": { + req: TODO; + res: TODO; + }; + "users/groups/show": { + req: TODO; + res: TODO; + }; + "users/groups/transfer": { + req: TODO; + res: TODO; + }; + "users/groups/update": { + req: TODO; + res: TODO; + }; + "users/lists/create": { + req: { + name: string; + }; + res: UserList; + }; + "users/lists/delete": { + req: { + listId: UserList["id"]; + }; + res: null; + }; + "users/lists/list": { + req: NoParams; + res: UserList[]; + }; + "users/lists/pull": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/push": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/show": { + req: { + listId: UserList["id"]; + }; + res: UserList; + }; + "users/lists/update": { + req: { + listId: UserList["id"]; + name: string; + }; + res: UserList; + }; + "users/notes": { + req: { + userId: User["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "users/pages": { + req: TODO; + res: TODO; + }; + "users/recommendation": { + req: TODO; + res: TODO; + }; + "users/relation": { + req: TODO; + res: TODO; + }; + "users/report-abuse": { + req: TODO; + res: TODO; + }; + "users/search-by-username-and-host": { + req: TODO; + res: TODO; + }; + "users/search": { + req: TODO; + res: TODO; + }; + "users/show": { + req: + | ShowUserReq + | { + userIds: User["id"][]; + }; + res: { + $switch: { + $cases: [ + [ + { + userIds: User["id"][]; + }, + UserDetailed[], + ], + ]; + $default: UserDetailed; + }; + }; + }; + "users/stats": { + req: TODO; + res: TODO; + }; }; declare namespace entities { @@ -2206,14 +2290,17 @@ declare namespace entities { export { entities } // @public (undocumented) -type FetchLike = (input: string, init?: { - method?: string; - body?: string; - credentials?: RequestCredentials; - cache?: RequestCache; -}) => Promise<{ - status: number; - json(): Promise<any>; +type FetchLike = ( + input: string, + init?: { + method?: string; + body?: string; + credentials?: RequestCredentials; + cache?: RequestCache; + }, +) => Promise<{ + status: number; + json(): Promise<any>; }>; // @public (undocumented) @@ -2221,27 +2308,27 @@ export const ffVisibility: readonly ["public", "followers", "private"]; // @public (undocumented) type Following = { - id: ID; - createdAt: DateString; - followerId: User['id']; - followeeId: User['id']; + id: ID; + createdAt: DateString; + followerId: User["id"]; + followeeId: User["id"]; }; // @public (undocumented) type FollowingFolloweePopulated = Following & { - followee: UserDetailed; + followee: UserDetailed; }; // @public (undocumented) type FollowingFollowerPopulated = Following & { - follower: UserDetailed; + follower: UserDetailed; }; // @public (undocumented) type FollowRequest = { - id: ID; - follower: User; - followee: User; + id: ID; + follower: User; + followee: User; }; // @public (undocumented) @@ -2252,279 +2339,319 @@ type ID = string; // @public (undocumented) type Instance = { - id: ID; - caughtAt: DateString; - host: string; - usersCount: number; - notesCount: number; - followingCount: number; - followersCount: number; - driveUsage: number; - driveFiles: number; - latestRequestSentAt: DateString | null; - latestStatus: number | null; - latestRequestReceivedAt: DateString | null; - lastCommunicatedAt: DateString; - isNotResponding: boolean; - isSuspended: boolean; - softwareName: string | null; - softwareVersion: string | null; - openRegistrations: boolean | null; - name: string | null; - description: string | null; - maintainerName: string | null; - maintainerEmail: string | null; - iconUrl: string | null; - faviconUrl: string | null; - themeColor: string | null; - infoUpdatedAt: DateString | null; + id: ID; + caughtAt: DateString; + host: string; + usersCount: number; + notesCount: number; + followingCount: number; + followersCount: number; + driveUsage: number; + driveFiles: number; + latestRequestSentAt: DateString | null; + latestStatus: number | null; + latestRequestReceivedAt: DateString | null; + lastCommunicatedAt: DateString; + isNotResponding: boolean; + isSuspended: boolean; + softwareName: string | null; + softwareVersion: string | null; + openRegistrations: boolean | null; + name: string | null; + description: string | null; + maintainerName: string | null; + maintainerEmail: string | null; + iconUrl: string | null; + faviconUrl: string | null; + themeColor: string | null; + infoUpdatedAt: DateString | null; }; // @public (undocumented) -type InstanceMetadata = LiteInstanceMetadata | DetailedInstanceMetadata; +type InstanceMetadata = + | LiteInstanceMetadata + | DetailedInstanceMetadata; // @public (undocumented) function isAPIError(reason: any): reason is APIError; // @public (undocumented) type LiteInstanceMetadata = { - maintainerName: string | null; - maintainerEmail: string | null; - version: string; - name: string | null; - uri: string; - description: string | null; - tosUrl: string | null; - disableRegistration: boolean; - disableLocalTimeline: boolean; - disableRecommendedTimeline: boolean; - disableGlobalTimeline: boolean; - driveCapacityPerLocalUserMb: number; - driveCapacityPerRemoteUserMb: number; - enableHcaptcha: boolean; - hcaptchaSiteKey: string | null; - enableRecaptcha: boolean; - recaptchaSiteKey: string | null; - swPublickey: string | null; - maxNoteTextLength: number; - enableEmail: boolean; - enableTwitterIntegration: boolean; - enableGithubIntegration: boolean; - enableDiscordIntegration: boolean; - enableServiceWorker: boolean; - emojis: CustomEmoji[]; - ads: { - id: ID; - ratio: number; - place: string; - url: string; - imageUrl: string; - }[]; + maintainerName: string | null; + maintainerEmail: string | null; + version: string; + name: string | null; + uri: string; + description: string | null; + tosUrl: string | null; + disableRegistration: boolean; + disableLocalTimeline: boolean; + disableRecommendedTimeline: boolean; + disableGlobalTimeline: boolean; + driveCapacityPerLocalUserMb: number; + driveCapacityPerRemoteUserMb: number; + enableHcaptcha: boolean; + hcaptchaSiteKey: string | null; + enableRecaptcha: boolean; + recaptchaSiteKey: string | null; + swPublickey: string | null; + maxNoteTextLength: number; + enableEmail: boolean; + enableTwitterIntegration: boolean; + enableGithubIntegration: boolean; + enableDiscordIntegration: boolean; + enableServiceWorker: boolean; + emojis: CustomEmoji[]; + ads: { + id: ID; + ratio: number; + place: string; + url: string; + imageUrl: string; + }[]; }; // @public (undocumented) type MeDetailed = UserDetailed & { - avatarId: DriveFile['id']; - bannerId: DriveFile['id']; - autoAcceptFollowed: boolean; - alwaysMarkNsfw: boolean; - carefulBot: boolean; - emailNotificationTypes: string[]; - hasPendingReceivedFollowRequest: boolean; - hasUnreadAnnouncement: boolean; - hasUnreadAntenna: boolean; - hasUnreadChannel: boolean; - hasUnreadMentions: boolean; - hasUnreadMessagingMessage: boolean; - hasUnreadNotification: boolean; - hasUnreadSpecifiedNotes: boolean; - hideOnlineStatus: boolean; - injectFeaturedNote: boolean; - integrations: Record<string, any>; - isDeleted: boolean; - isExplorable: boolean; - mutedWords: string[][]; - mutingNotificationTypes: string[]; - noCrawle: boolean; - receiveAnnouncementEmail: boolean; - usePasswordLessLogin: boolean; - [other: string]: any; + avatarId: DriveFile["id"]; + bannerId: DriveFile["id"]; + autoAcceptFollowed: boolean; + alwaysMarkNsfw: boolean; + carefulBot: boolean; + emailNotificationTypes: string[]; + hasPendingReceivedFollowRequest: boolean; + hasUnreadAnnouncement: boolean; + hasUnreadAntenna: boolean; + hasUnreadChannel: boolean; + hasUnreadMentions: boolean; + hasUnreadMessagingMessage: boolean; + hasUnreadNotification: boolean; + hasUnreadSpecifiedNotes: boolean; + hideOnlineStatus: boolean; + injectFeaturedNote: boolean; + integrations: Record<string, any>; + isDeleted: boolean; + isExplorable: boolean; + mutedWords: string[][]; + mutingNotificationTypes: string[]; + noCrawle: boolean; + preventAiLearning: boolean; + receiveAnnouncementEmail: boolean; + usePasswordLessLogin: boolean; + [other: string]: any; }; // @public (undocumented) type MessagingMessage = { - id: ID; - createdAt: DateString; - file: DriveFile | null; - fileId: DriveFile['id'] | null; - isRead: boolean; - reads: User['id'][]; - text: string | null; - user: User; - userId: User['id']; - recipient?: User | null; - recipientId: User['id'] | null; - group?: UserGroup | null; - groupId: UserGroup['id'] | null; + id: ID; + createdAt: DateString; + file: DriveFile | null; + fileId: DriveFile["id"] | null; + isRead: boolean; + reads: User["id"][]; + text: string | null; + user: User; + userId: User["id"]; + recipient?: User | null; + recipientId: User["id"] | null; + group?: UserGroup | null; + groupId: UserGroup["id"] | null; }; // @public (undocumented) -export const mutedNoteReasons: readonly ["word", "manual", "spam", "other"]; +export const mutedNoteReasons: readonly [ + "word", + "manual", + "spam", + "other", +]; // @public (undocumented) type Note = { - id: ID; - createdAt: DateString; - text: string | null; - cw: string | null; - user: User; - userId: User['id']; - reply?: Note; - replyId: Note['id']; - renote?: Note; - renoteId: Note['id']; - files: DriveFile[]; - fileIds: DriveFile['id'][]; - visibility: 'public' | 'home' | 'followers' | 'specified'; - visibleUserIds?: User['id'][]; - localOnly?: boolean; - myReaction?: string; - reactions: Record<string, number>; - renoteCount: number; - repliesCount: number; - poll?: { - expiresAt: DateString | null; - multiple: boolean; - choices: { - isVoted: boolean; - text: string; - votes: number; - }[]; - }; - emojis: { - name: string; - url: string; - }[]; - uri?: string; - url?: string; - isHidden?: boolean; + id: ID; + createdAt: DateString; + text: string | null; + cw: string | null; + user: User; + userId: User["id"]; + reply?: Note; + replyId: Note["id"]; + renote?: Note; + renoteId: Note["id"]; + files: DriveFile[]; + fileIds: DriveFile["id"][]; + visibility: "public" | "home" | "followers" | "specified"; + visibleUserIds?: User["id"][]; + localOnly?: boolean; + channel?: Channel["id"]; + myReaction?: string; + reactions: Record<string, number>; + renoteCount: number; + repliesCount: number; + poll?: { + expiresAt: DateString | null; + multiple: boolean; + choices: { + isVoted: boolean; + text: string; + votes: number; + }[]; + }; + emojis: { + name: string; + url: string; + }[]; + uri?: string; + url?: string; + updatedAt?: DateString; + isHidden?: boolean; }; // @public (undocumented) type NoteFavorite = { - id: ID; - createdAt: DateString; - noteId: Note['id']; - note: Note; + id: ID; + createdAt: DateString; + noteId: Note["id"]; + note: Note; }; // @public (undocumented) type NoteReaction = { - id: ID; - createdAt: DateString; - user: UserLite; - type: string; + id: ID; + createdAt: DateString; + user: UserLite; + type: string; }; // @public (undocumented) -export const noteVisibilities: readonly ["public", "home", "followers", "specified"]; +export const noteVisibilities: readonly [ + "public", + "home", + "followers", + "specified", +]; // @public (undocumented) type Notification_2 = { - id: ID; - createdAt: DateString; - isRead: boolean; -} & ({ - type: 'reaction'; - reaction: string; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'reply'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'renote'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'quote'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'mention'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'pollVote'; - user: User; - userId: User['id']; - note: Note; -} | { - type: 'follow'; - user: User; - userId: User['id']; -} | { - type: 'followRequestAccepted'; - user: User; - userId: User['id']; -} | { - type: 'receiveFollowRequest'; - user: User; - userId: User['id']; -} | { - type: 'groupInvited'; - invitation: UserGroup; - user: User; - userId: User['id']; -} | { - type: 'app'; - header?: string | null; - body: string; - icon?: string | null; -}); + id: ID; + createdAt: DateString; + isRead: boolean; +} & ( + | { + type: "reaction"; + reaction: string; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "reply"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "renote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "quote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "mention"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "pollVote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "follow"; + user: User; + userId: User["id"]; + } + | { + type: "followRequestAccepted"; + user: User; + userId: User["id"]; + } + | { + type: "receiveFollowRequest"; + user: User; + userId: User["id"]; + } + | { + type: "groupInvited"; + invitation: UserGroup; + user: User; + userId: User["id"]; + } + | { + type: "app"; + header?: string | null; + body: string; + icon?: string | null; + } +); // @public (undocumented) -export const notificationTypes: readonly ["follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "pollEnded", "receiveFollowRequest", "followRequestAccepted", "groupInvited", "app"]; +export const notificationTypes: readonly [ + "follow", + "mention", + "reply", + "renote", + "quote", + "reaction", + "pollVote", + "pollEnded", + "receiveFollowRequest", + "followRequestAccepted", + "groupInvited", + "app", +]; // @public (undocumented) -type OriginType = 'combined' | 'local' | 'remote'; +type OriginType = "combined" | "local" | "remote"; // @public (undocumented) type Page = { - id: ID; - createdAt: DateString; - updatedAt: DateString; - userId: User['id']; - user: User; - content: Record<string, any>[]; - variables: Record<string, any>[]; - title: string; - name: string; - summary: string | null; - hideTitleWhenPinned: boolean; - alignCenter: boolean; - font: string; - script: string; - eyeCatchingImageId: DriveFile['id'] | null; - eyeCatchingImage: DriveFile | null; - attachedFiles: any; - likedCount: number; - isLiked?: boolean; + id: ID; + createdAt: DateString; + updatedAt: DateString; + userId: User["id"]; + user: User; + content: Record<string, any>[]; + variables: Record<string, any>[]; + title: string; + name: string; + summary: string | null; + hideTitleWhenPinned: boolean; + alignCenter: boolean; + font: string; + script: string; + eyeCatchingImageId: DriveFile["id"] | null; + eyeCatchingImage: DriveFile | null; + attachedFiles: any; + likedCount: number; + isLiked?: boolean; }; // @public (undocumented) type PageEvent = { - pageId: Page['id']; - event: string; - var: any; - userId: User['id']; - user: User; + pageId: Page["id"]; + event: string; + var: any; + userId: User["id"]; + user: User; }; // @public (undocumented) @@ -2532,117 +2659,126 @@ export const permissions: string[]; // @public (undocumented) type ServerInfo = { - machine: string; - cpu: { - model: string; - cores: number; - }; - mem: { - total: number; - }; - fs: { - total: number; - used: number; - }; + machine: string; + cpu: { + model: string; + cores: number; + }; + mem: { + total: number; + }; + fs: { + total: number; + used: number; + }; }; // @public (undocumented) type Signin = { - id: ID; - createdAt: DateString; - ip: string; - headers: Record<string, any>; - success: boolean; + id: ID; + createdAt: DateString; + ip: string; + headers: Record<string, any>; + success: boolean; }; // @public (undocumented) type Stats = { - notesCount: number; - originalNotesCount: number; - usersCount: number; - originalUsersCount: number; - instances: number; - driveUsageLocal: number; - driveUsageRemote: number; + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + instances: number; + driveUsageLocal: number; + driveUsageRemote: number; }; // Warning: (ae-forgotten-export) The symbol "StreamEvents" needs to be exported by the entry point index.d.ts // // @public (undocumented) export class Stream extends EventEmitter<StreamEvents> { - constructor(origin: string, user: { - token: string; - } | null, options?: { - WebSocket?: any; - }); - // (undocumented) + constructor( + origin: string, + user: { + token: string; + } | null, + options?: { + WebSocket?: any; + }, + ); + // (undocumented) close(): void; - // Warning: (ae-forgotten-export) The symbol "NonSharedConnection" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "NonSharedConnection" needs to be exported by the entry point index.d.ts // // (undocumented) disconnectToChannel(connection: NonSharedConnection): void; - // Warning: (ae-forgotten-export) The symbol "SharedConnection" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "SharedConnection" needs to be exported by the entry point index.d.ts // // (undocumented) removeSharedConnection(connection: SharedConnection): void; - // Warning: (ae-forgotten-export) The symbol "Pool" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "Pool" needs to be exported by the entry point index.d.ts // // (undocumented) removeSharedConnectionPool(pool: Pool): void; - // (undocumented) + // (undocumented) send(typeOrPayload: any, payload?: any): void; - // (undocumented) - state: 'initializing' | 'reconnecting' | 'connected'; - // (undocumented) - useChannel<C extends keyof Channels>(channel: C, params?: Channels[C]['params'], name?: string): ChannelConnection<Channels[C]>; -} + // (undocumented) + state: "initializing" | "reconnecting" | "connected"; + // (undocumented) + useChannel<C extends keyof Channels>( + channel: C, + params?: Channels[C]["params"], + name?: string, + ): ChannelConnection<Channels[C]>; + } // @public (undocumented) type User = UserLite | UserDetailed; // @public (undocumented) type UserDetailed = UserLite & { - bannerBlurhash: string | null; - bannerColor: string | null; - bannerUrl: string | null; - birthday: string | null; - createdAt: DateString; - description: string | null; - ffVisibility: 'public' | 'followers' | 'private'; - fields: { - name: string; - value: string; - }[]; - followersCount: number; - followingCount: number; - hasPendingFollowRequestFromYou: boolean; - hasPendingFollowRequestToYou: boolean; - isAdmin: boolean; - isBlocked: boolean; - isBlocking: boolean; - isBot: boolean; - isCat: boolean; - isFollowed: boolean; - isFollowing: boolean; - isLocked: boolean; - isModerator: boolean; - isMuted: boolean; - isSilenced: boolean; - isSuspended: boolean; - lang: string | null; - lastFetchedAt?: DateString; - location: string | null; - notesCount: number; - pinnedNoteIds: ID[]; - pinnedNotes: Note[]; - pinnedPage: Page | null; - pinnedPageId: string | null; - publicReactions: boolean; - securityKeys: boolean; - twoFactorEnabled: boolean; - updatedAt: DateString | null; - uri: string | null; - url: string | null; + bannerBlurhash: string | null; + bannerColor: string | null; + bannerUrl: string | null; + birthday: string | null; + createdAt: DateString; + description: string | null; + ffVisibility: "public" | "followers" | "private"; + fields: { + name: string; + value: string; + }[]; + followersCount: number; + followingCount: number; + hasPendingFollowRequestFromYou: boolean; + hasPendingFollowRequestToYou: boolean; + isAdmin: boolean; + isBlocked: boolean; + isBlocking: boolean; + isBot: boolean; + isCat: boolean; + isFollowed: boolean; + isFollowing: boolean; + isLocked: boolean; + isModerator: boolean; + isMuted: boolean; + isRenoteMuted: boolean; + isSilenced: boolean; + isSuspended: boolean; + lang: string | null; + lastFetchedAt?: DateString; + location: string | null; + notesCount: number; + pinnedNoteIds: ID[]; + pinnedNotes: Note[]; + pinnedPage: Page | null; + pinnedPageId: string | null; + publicReactions: boolean; + securityKeys: boolean; + twoFactorEnabled: boolean; + updatedAt: DateString | null; + uri: string | null; + url: string | null; }; // @public (undocumented) @@ -2650,46 +2786,53 @@ type UserGroup = TODO_2; // @public (undocumented) type UserList = { - id: ID; - createdAt: DateString; - name: string; - userIds: User['id'][]; + id: ID; + createdAt: DateString; + name: string; + userIds: User["id"][]; }; // @public (undocumented) type UserLite = { - id: ID; - username: string; - host: string | null; - name: string; - onlineStatus: 'online' | 'active' | 'offline' | 'unknown'; - avatarUrl: string; - avatarBlurhash: string; - alsoKnownAs: string[]; - movedToUri: any; - emojis: { - name: string; - url: string; - }[]; - instance?: { - name: Instance['name']; - softwareName: Instance['softwareName']; - softwareVersion: Instance['softwareVersion']; - iconUrl: Instance['iconUrl']; - faviconUrl: Instance['faviconUrl']; - themeColor: Instance['themeColor']; - }; + id: ID; + username: string; + host: string | null; + name: string; + onlineStatus: "online" | "active" | "offline" | "unknown"; + avatarUrl: string; + avatarBlurhash: string; + alsoKnownAs: string[]; + movedToUri: any; + emojis: { + name: string; + url: string; + }[]; + instance?: { + name: Instance["name"]; + softwareName: Instance["softwareName"]; + softwareVersion: Instance["softwareVersion"]; + iconUrl: Instance["iconUrl"]; + faviconUrl: Instance["faviconUrl"]; + themeColor: Instance["themeColor"]; + }; }; // @public (undocumented) -type UserSorting = '+follower' | '-follower' | '+createdAt' | '-createdAt' | '+updatedAt' | '-updatedAt'; +type UserSorting = + | "+follower" + | "-follower" + | "+createdAt" + | "-createdAt" + | "+updatedAt" + | "-updatedAt"; // Warnings were encountered during analysis: // -// src/api.types.ts:16:32 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts -// src/api.types.ts:18:25 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts -// src/api.types.ts:601:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts -// src/streaming.types.ts:35:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts +// src/api.types.ts:80:37 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts +// src/api.types.ts:83:28 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts +// src/api.types.ts:853:5 - (ae-forgotten-export) The symbol "NoteSubmitReq" needs to be exported by the entry point index.d.ts +// src/api.types.ts:1094:3 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts +// src/streaming.types.ts:56:18 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/packages/calckey-js/markdown/calckey-js.acct.md b/packages/calckey-js/markdown/calckey-js.acct.md new file mode 100644 index 0000000000..2535e0e9a8 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.acct.md @@ -0,0 +1,14 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Acct](./calckey-js.acct.md) + +## Acct type + +**Signature:** + +```typescript +export declare type Acct = { + username: string; + host: string | null; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md b/packages/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md new file mode 100644 index 0000000000..ed4c03effc --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md @@ -0,0 +1,24 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [(constructor)](./calckey-js.api.apiclient._constructor_.md) + +## api.APIClient.(constructor) + +Constructs a new instance of the `APIClient` class + +**Signature:** + +```typescript +constructor(opts: { + origin: APIClient["origin"]; + credential?: APIClient["credential"]; + fetch?: APIClient["fetch"] | null | undefined; + }); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| opts | { origin: [APIClient](./calckey-js.api.apiclient.md)<!-- -->\["origin"\]; credential?: [APIClient](./calckey-js.api.apiclient.md)<!-- -->\["credential"\]; fetch?: [APIClient](./calckey-js.api.apiclient.md)<!-- -->\["fetch"\] \| null \| undefined; } | | + diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.credential.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.credential.md new file mode 100644 index 0000000000..2c14d244a3 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.credential.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [credential](./calckey-js.api.apiclient.credential.md) + +## api.APIClient.credential property + +**Signature:** + +```typescript +credential: string | null | undefined; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.fetch.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.fetch.md new file mode 100644 index 0000000000..c7108c23db --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.fetch.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [fetch](./calckey-js.api.apiclient.fetch.md) + +## api.APIClient.fetch property + +**Signature:** + +```typescript +fetch: FetchLike; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.md new file mode 100644 index 0000000000..92dff826fa --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.md @@ -0,0 +1,32 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) + +## api.APIClient class + +**Signature:** + +```typescript +export declare class APIClient +``` + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(opts)](./calckey-js.api.apiclient._constructor_.md) | | Constructs a new instance of the <code>APIClient</code> class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [credential](./calckey-js.api.apiclient.credential.md) | | string \| null \| undefined | | +| [fetch](./calckey-js.api.apiclient.fetch.md) | | [FetchLike](./calckey-js.api.fetchlike.md) | | +| [origin](./calckey-js.api.apiclient.origin.md) | | string | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [request(endpoint, params, credential)](./calckey-js.api.apiclient.request.md) | | | + diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.origin.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.origin.md new file mode 100644 index 0000000000..1f6a4be912 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.origin.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [origin](./calckey-js.api.apiclient.origin.md) + +## api.APIClient.origin property + +**Signature:** + +```typescript +origin: string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.apiclient.request.md b/packages/calckey-js/markdown/calckey-js.api.apiclient.request.md new file mode 100644 index 0000000000..a330011777 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apiclient.request.md @@ -0,0 +1,57 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [request](./calckey-js.api.apiclient.request.md) + +## api.APIClient.request() method + +**Signature:** + +```typescript +request<E extends keyof Endpoints, P extends Endpoints[E]["req"]>( + endpoint: E, + params?: P, + credential?: string | null | undefined, + ): Promise< + Endpoints[E]["res"] extends { + $switch: { + $cases: [any, any][]; + $default: any; + }; + } + ? IsCaseMatched<E, P, 0> extends true + ? GetCaseResult<E, P, 0> + : IsCaseMatched<E, P, 1> extends true + ? GetCaseResult<E, P, 1> + : IsCaseMatched<E, P, 2> extends true + ? GetCaseResult<E, P, 2> + : IsCaseMatched<E, P, 3> extends true + ? GetCaseResult<E, P, 3> + : IsCaseMatched<E, P, 4> extends true + ? GetCaseResult<E, P, 4> + : IsCaseMatched<E, P, 5> extends true + ? GetCaseResult<E, P, 5> + : IsCaseMatched<E, P, 6> extends true + ? GetCaseResult<E, P, 6> + : IsCaseMatched<E, P, 7> extends true + ? GetCaseResult<E, P, 7> + : IsCaseMatched<E, P, 8> extends true + ? GetCaseResult<E, P, 8> + : IsCaseMatched<E, P, 9> extends true + ? GetCaseResult<E, P, 9> + : Endpoints[E]["res"]["$switch"]["$default"] + : Endpoints[E]["res"] + >; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| endpoint | E | | +| params | P | _(Optional)_ | +| credential | string \| null \| undefined | _(Optional)_ | + +**Returns:** + +Promise< [Endpoints](./calckey-js.endpoints.md)<!-- -->\[E\]\["res"\] extends { $switch: { $cases: \[any, any\]\[\]; $default: any; }; } ? IsCaseMatched<E, P, 0> extends true ? GetCaseResult<E, P, 0> : IsCaseMatched<E, P, 1> extends true ? GetCaseResult<E, P, 1> : IsCaseMatched<E, P, 2> extends true ? GetCaseResult<E, P, 2> : IsCaseMatched<E, P, 3> extends true ? GetCaseResult<E, P, 3> : IsCaseMatched<E, P, 4> extends true ? GetCaseResult<E, P, 4> : IsCaseMatched<E, P, 5> extends true ? GetCaseResult<E, P, 5> : IsCaseMatched<E, P, 6> extends true ? GetCaseResult<E, P, 6> : IsCaseMatched<E, P, 7> extends true ? GetCaseResult<E, P, 7> : IsCaseMatched<E, P, 8> extends true ? GetCaseResult<E, P, 8> : IsCaseMatched<E, P, 9> extends true ? GetCaseResult<E, P, 9> : [Endpoints](./calckey-js.endpoints.md)<!-- -->\[E\]\["res"\]\["$switch"\]\["$default"\] : [Endpoints](./calckey-js.endpoints.md)<!-- -->\[E\]\["res"\] > + diff --git a/packages/calckey-js/markdown/calckey-js.api.apierror.md b/packages/calckey-js/markdown/calckey-js.api.apierror.md new file mode 100644 index 0000000000..7927cfd895 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.apierror.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIError](./calckey-js.api.apierror.md) + +## api.APIError type + +**Signature:** + +```typescript +export declare type APIError = { + id: string; + code: string; + message: string; + kind: "client" | "server"; + info: Record<string, any>; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.fetchlike.md b/packages/calckey-js/markdown/calckey-js.api.fetchlike.md new file mode 100644 index 0000000000..9ec29fa2d5 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.fetchlike.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [FetchLike](./calckey-js.api.fetchlike.md) + +## api.FetchLike type + +**Signature:** + +```typescript +export declare type FetchLike = ( + input: string, + init?: { + method?: string; + body?: string; + credentials?: RequestCredentials; + cache?: RequestCache; + }, +) => Promise<{ + status: number; + json(): Promise<any>; +}>; +``` diff --git a/packages/calckey-js/markdown/calckey-js.api.isapierror.md b/packages/calckey-js/markdown/calckey-js.api.isapierror.md new file mode 100644 index 0000000000..965bf9ce27 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.isapierror.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [isAPIError](./calckey-js.api.isapierror.md) + +## api.isAPIError() function + +**Signature:** + +```typescript +export declare function isAPIError(reason: any): reason is APIError; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| reason | any | | + +**Returns:** + +reason is [APIError](./calckey-js.api.apierror.md) + diff --git a/packages/calckey-js/markdown/calckey-js.api.md b/packages/calckey-js/markdown/calckey-js.api.md new file mode 100644 index 0000000000..eee1920abc --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.api.md @@ -0,0 +1,25 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) + +## api namespace + +## Classes + +| Class | Description | +| --- | --- | +| [APIClient](./calckey-js.api.apiclient.md) | | + +## Functions + +| Function | Description | +| --- | --- | +| [isAPIError(reason)](./calckey-js.api.isapierror.md) | | + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [APIError](./calckey-js.api.apierror.md) | | +| [FetchLike](./calckey-js.api.fetchlike.md) | | + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection._constructor_.md b/packages/calckey-js/markdown/calckey-js.channelconnection._constructor_.md new file mode 100644 index 0000000000..65f7c3eee0 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection._constructor_.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [(constructor)](./calckey-js.channelconnection._constructor_.md) + +## ChannelConnection.(constructor) + +Constructs a new instance of the `Connection` class + +**Signature:** + +```typescript +constructor(stream: Stream, channel: string, name?: string); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| stream | [Stream](./calckey-js.stream.md) | | +| channel | string | | +| name | string | _(Optional)_ | + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.channel.md b/packages/calckey-js/markdown/calckey-js.channelconnection.channel.md new file mode 100644 index 0000000000..bbf36efced --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.channel.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [channel](./calckey-js.channelconnection.channel.md) + +## ChannelConnection.channel property + +**Signature:** + +```typescript +channel: string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.dispose.md b/packages/calckey-js/markdown/calckey-js.channelconnection.dispose.md new file mode 100644 index 0000000000..847e7dfae4 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.dispose.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [dispose](./calckey-js.channelconnection.dispose.md) + +## ChannelConnection.dispose() method + +**Signature:** + +```typescript +abstract dispose(): void; +``` +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.id.md b/packages/calckey-js/markdown/calckey-js.channelconnection.id.md new file mode 100644 index 0000000000..b145ffa067 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.id.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [id](./calckey-js.channelconnection.id.md) + +## ChannelConnection.id property + +**Signature:** + +```typescript +abstract id: string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.incount.md b/packages/calckey-js/markdown/calckey-js.channelconnection.incount.md new file mode 100644 index 0000000000..b7ef319e2d --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.incount.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [inCount](./calckey-js.channelconnection.incount.md) + +## ChannelConnection.inCount property + +**Signature:** + +```typescript +inCount: number; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.md b/packages/calckey-js/markdown/calckey-js.channelconnection.md new file mode 100644 index 0000000000..0429baa805 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.md @@ -0,0 +1,39 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) + +## ChannelConnection class + +**Signature:** + +```typescript +export declare abstract class Connection< + Channel extends AnyOf<Channels> = any, +> extends EventEmitter<Channel["events"]> +``` +**Extends:** EventEmitter<Channel\["events"\]> + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(stream, channel, name)](./calckey-js.channelconnection._constructor_.md) | | Constructs a new instance of the <code>Connection</code> class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [channel](./calckey-js.channelconnection.channel.md) | | string | | +| [id](./calckey-js.channelconnection.id.md) | <code>abstract</code> | string | | +| [inCount](./calckey-js.channelconnection.incount.md) | | number | | +| [name?](./calckey-js.channelconnection.name.md) | | string | _(Optional)_ | +| [outCount](./calckey-js.channelconnection.outcount.md) | | number | | +| [stream](./calckey-js.channelconnection.stream.md) | <code>protected</code> | [Stream](./calckey-js.stream.md) | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [dispose()](./calckey-js.channelconnection.dispose.md) | <code>abstract</code> | | +| [send(type, body)](./calckey-js.channelconnection.send.md) | | | + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.name.md b/packages/calckey-js/markdown/calckey-js.channelconnection.name.md new file mode 100644 index 0000000000..b364bdf844 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.name.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [name](./calckey-js.channelconnection.name.md) + +## ChannelConnection.name property + +**Signature:** + +```typescript +name?: string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.outcount.md b/packages/calckey-js/markdown/calckey-js.channelconnection.outcount.md new file mode 100644 index 0000000000..e300757688 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.outcount.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [outCount](./calckey-js.channelconnection.outcount.md) + +## ChannelConnection.outCount property + +**Signature:** + +```typescript +outCount: number; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.send.md b/packages/calckey-js/markdown/calckey-js.channelconnection.send.md new file mode 100644 index 0000000000..2ee5c20159 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.send.md @@ -0,0 +1,26 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [send](./calckey-js.channelconnection.send.md) + +## ChannelConnection.send() method + +**Signature:** + +```typescript +send<T extends keyof Channel["receives"]>( + type: T, + body: Channel["receives"][T], + ): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| type | T | | +| body | Channel\["receives"\]\[T\] | | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.channelconnection.stream.md b/packages/calckey-js/markdown/calckey-js.channelconnection.stream.md new file mode 100644 index 0000000000..2e1fc584c2 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channelconnection.stream.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [stream](./calckey-js.channelconnection.stream.md) + +## ChannelConnection.stream property + +**Signature:** + +```typescript +protected stream: Stream; +``` diff --git a/packages/calckey-js/markdown/calckey-js.channels.md b/packages/calckey-js/markdown/calckey-js.channels.md new file mode 100644 index 0000000000..952a79f044 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.channels.md @@ -0,0 +1,143 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Channels](./calckey-js.channels.md) + +## Channels type + +**Signature:** + +```typescript +export declare type Channels = { + main: { + params: null; + events: { + notification: (payload: Notification) => void; + mention: (payload: Note) => void; + reply: (payload: Note) => void; + renote: (payload: Note) => void; + follow: (payload: User) => void; + followed: (payload: User) => void; + unfollow: (payload: User) => void; + meUpdated: (payload: MeDetailed) => void; + pageEvent: (payload: PageEvent) => void; + urlUploadFinished: (payload: { + marker: string; + file: DriveFile; + }) => void; + readAllNotifications: () => void; + unreadNotification: (payload: Notification) => void; + unreadMention: (payload: Note["id"]) => void; + readAllUnreadMentions: () => void; + unreadSpecifiedNote: (payload: Note["id"]) => void; + readAllUnreadSpecifiedNotes: () => void; + readAllMessagingMessages: () => void; + messagingMessage: (payload: MessagingMessage) => void; + unreadMessagingMessage: (payload: MessagingMessage) => void; + readAllAntennas: () => void; + unreadAntenna: (payload: Antenna) => void; + readAllAnnouncements: () => void; + readAllChannels: () => void; + unreadChannel: (payload: Note["id"]) => void; + myTokenRegenerated: () => void; + reversiNoInvites: () => void; + reversiInvited: (payload: FIXME) => void; + signin: (payload: FIXME) => void; + registryUpdated: (payload: { + scope?: string[]; + key: string; + value: any | null; + }) => void; + driveFileCreated: (payload: DriveFile) => void; + readAntenna: (payload: Antenna) => void; + }; + receives: null; + }; + homeTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + localTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + hybridTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + recommendedTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + globalTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + messaging: { + params: { + otherparty?: User["id"] | null; + group?: UserGroup["id"] | null; + }; + events: { + message: (payload: MessagingMessage) => void; + deleted: (payload: MessagingMessage["id"]) => void; + read: (payload: MessagingMessage["id"][]) => void; + typers: (payload: User[]) => void; + }; + receives: { + read: { + id: MessagingMessage["id"]; + }; + }; + }; + serverStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; + queueStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; +}; +``` +**References:** [Note](./calckey-js.entities.note.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [MeDetailed](./calckey-js.entities.medetailed.md)<!-- -->, [PageEvent](./calckey-js.entities.pageevent.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md)<!-- -->, [MessagingMessage](./calckey-js.entities.messagingmessage.md)<!-- -->, [Antenna](./calckey-js.entities.antenna.md)<!-- -->, [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/packages/calckey-js/markdown/calckey-js.endpoints.md b/packages/calckey-js/markdown/calckey-js.endpoints.md new file mode 100644 index 0000000000..c38a936836 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.endpoints.md @@ -0,0 +1,1911 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Endpoints](./calckey-js.endpoints.md) + +## Endpoints type + +**Signature:** + +```typescript +export declare type Endpoints = { + "admin/abuse-user-reports": { + req: TODO; + res: TODO; + }; + "admin/delete-all-files-of-a-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "admin/delete-logs": { + req: NoParams; + res: null; + }; + "admin/get-index-stats": { + req: TODO; + res: TODO; + }; + "admin/get-table-stats": { + req: TODO; + res: TODO; + }; + "admin/invite": { + req: TODO; + res: TODO; + }; + "admin/logs": { + req: TODO; + res: TODO; + }; + "admin/meta": { + req: TODO; + res: TODO; + }; + "admin/reset-password": { + req: TODO; + res: TODO; + }; + "admin/resolve-abuse-user-report": { + req: TODO; + res: TODO; + }; + "admin/resync-chart": { + req: TODO; + res: TODO; + }; + "admin/send-email": { + req: TODO; + res: TODO; + }; + "admin/server-info": { + req: TODO; + res: TODO; + }; + "admin/show-moderation-logs": { + req: TODO; + res: TODO; + }; + "admin/show-user": { + req: TODO; + res: TODO; + }; + "admin/show-users": { + req: TODO; + res: TODO; + }; + "admin/silence-user": { + req: TODO; + res: TODO; + }; + "admin/suspend-user": { + req: TODO; + res: TODO; + }; + "admin/unsilence-user": { + req: TODO; + res: TODO; + }; + "admin/unsuspend-user": { + req: TODO; + res: TODO; + }; + "admin/update-meta": { + req: TODO; + res: TODO; + }; + "admin/vacuum": { + req: TODO; + res: TODO; + }; + "admin/accounts/create": { + req: TODO; + res: TODO; + }; + "admin/ad/create": { + req: TODO; + res: TODO; + }; + "admin/ad/delete": { + req: { + id: Ad["id"]; + }; + res: null; + }; + "admin/ad/list": { + req: TODO; + res: TODO; + }; + "admin/ad/update": { + req: TODO; + res: TODO; + }; + "admin/announcements/create": { + req: TODO; + res: TODO; + }; + "admin/announcements/delete": { + req: { + id: Announcement["id"]; + }; + res: null; + }; + "admin/announcements/list": { + req: TODO; + res: TODO; + }; + "admin/announcements/update": { + req: TODO; + res: TODO; + }; + "admin/drive/clean-remote-files": { + req: TODO; + res: TODO; + }; + "admin/drive/cleanup": { + req: TODO; + res: TODO; + }; + "admin/drive/files": { + req: TODO; + res: TODO; + }; + "admin/drive/show-file": { + req: TODO; + res: TODO; + }; + "admin/emoji/add": { + req: TODO; + res: TODO; + }; + "admin/emoji/copy": { + req: TODO; + res: TODO; + }; + "admin/emoji/list-remote": { + req: TODO; + res: TODO; + }; + "admin/emoji/list": { + req: TODO; + res: TODO; + }; + "admin/emoji/remove": { + req: TODO; + res: TODO; + }; + "admin/emoji/update": { + req: TODO; + res: TODO; + }; + "admin/federation/delete-all-files": { + req: { + host: string; + }; + res: null; + }; + "admin/federation/refresh-remote-instance-metadata": { + req: TODO; + res: TODO; + }; + "admin/federation/remove-all-following": { + req: TODO; + res: TODO; + }; + "admin/federation/update-instance": { + req: TODO; + res: TODO; + }; + "admin/moderators/add": { + req: TODO; + res: TODO; + }; + "admin/moderators/remove": { + req: TODO; + res: TODO; + }; + "admin/promo/create": { + req: TODO; + res: TODO; + }; + "admin/queue/clear": { + req: TODO; + res: TODO; + }; + "admin/queue/deliver-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/inbox-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/jobs": { + req: TODO; + res: TODO; + }; + "admin/queue/stats": { + req: TODO; + res: TODO; + }; + "admin/relays/add": { + req: TODO; + res: TODO; + }; + "admin/relays/list": { + req: TODO; + res: TODO; + }; + "admin/relays/remove": { + req: TODO; + res: TODO; + }; + announcements: { + req: { + limit?: number; + withUnreads?: boolean; + sinceId?: Announcement["id"]; + untilId?: Announcement["id"]; + }; + res: Announcement[]; + }; + "antennas/create": { + req: TODO; + res: Antenna; + }; + "antennas/delete": { + req: { + antennaId: Antenna["id"]; + }; + res: null; + }; + "antennas/list": { + req: NoParams; + res: Antenna[]; + }; + "antennas/notes": { + req: { + antennaId: Antenna["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "antennas/show": { + req: { + antennaId: Antenna["id"]; + }; + res: Antenna; + }; + "antennas/update": { + req: TODO; + res: Antenna; + }; + "antennas/mark-read": { + req: TODO; + res: Antenna; + }; + "ap/get": { + req: { + uri: string; + }; + res: Record<string, any>; + }; + "ap/show": { + req: { + uri: string; + }; + res: + | { + type: "Note"; + object: Note; + } + | { + type: "User"; + object: UserDetailed; + }; + }; + "app/create": { + req: TODO; + res: App; + }; + "app/show": { + req: { + appId: App["id"]; + }; + res: App; + }; + "auth/accept": { + req: { + token: string; + }; + res: null; + }; + "auth/session/generate": { + req: { + appSecret: string; + }; + res: { + token: string; + url: string; + }; + }; + "auth/session/show": { + req: { + token: string; + }; + res: AuthSession; + }; + "auth/session/userkey": { + req: { + appSecret: string; + token: string; + }; + res: { + accessToken: string; + user: User; + }; + }; + "blocking/create": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/delete": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/list": { + req: { + limit?: number; + sinceId?: Blocking["id"]; + untilId?: Blocking["id"]; + }; + res: Blocking[]; + }; + "channels/create": { + req: TODO; + res: TODO; + }; + "channels/featured": { + req: TODO; + res: TODO; + }; + "channels/follow": { + req: TODO; + res: TODO; + }; + "channels/followed": { + req: TODO; + res: TODO; + }; + "channels/owned": { + req: TODO; + res: TODO; + }; + "channels/pin-note": { + req: TODO; + res: TODO; + }; + "channels/show": { + req: TODO; + res: TODO; + }; + "channels/timeline": { + req: TODO; + res: TODO; + }; + "channels/unfollow": { + req: TODO; + res: TODO; + }; + "channels/update": { + req: TODO; + res: TODO; + }; + "charts/active-users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + users: number[]; + }; + remote: { + users: number[]; + }; + }; + }; + "charts/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + remote: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + }; + "charts/federation": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + instance: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/hashtag": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/instance": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + host: string; + }; + res: { + drive: { + decFiles: number[]; + decUsage: number[]; + incFiles: number[]; + incUsage: number[]; + totalFiles: number[]; + totalUsage: number[]; + }; + followers: { + dec: number[]; + inc: number[]; + total: number[]; + }; + following: { + dec: number[]; + inc: number[]; + total: number[]; + }; + notes: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + requests: { + failed: number[]; + received: number[]; + succeeded: number[]; + }; + users: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/network": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + }; + "charts/user/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + "charts/user/following": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/user/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + "charts/user/reactions": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "clips/add-note": { + req: TODO; + res: TODO; + }; + "clips/create": { + req: TODO; + res: TODO; + }; + "clips/delete": { + req: { + clipId: Clip["id"]; + }; + res: null; + }; + "clips/list": { + req: TODO; + res: TODO; + }; + "clips/notes": { + req: TODO; + res: TODO; + }; + "clips/show": { + req: TODO; + res: TODO; + }; + "clips/update": { + req: TODO; + res: TODO; + }; + drive: { + req: NoParams; + res: { + capacity: number; + usage: number; + }; + }; + "drive/files": { + req: { + folderId?: DriveFolder["id"] | null; + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + "drive/files/attached-notes": { + req: TODO; + res: TODO; + }; + "drive/files/check-existence": { + req: TODO; + res: TODO; + }; + "drive/files/create": { + req: TODO; + res: TODO; + }; + "drive/files/delete": { + req: { + fileId: DriveFile["id"]; + }; + res: null; + }; + "drive/files/find-by-hash": { + req: TODO; + res: TODO; + }; + "drive/files/find": { + req: { + name: string; + folderId?: DriveFolder["id"] | null; + }; + res: DriveFile[]; + }; + "drive/files/show": { + req: { + fileId?: DriveFile["id"]; + url?: string; + }; + res: DriveFile; + }; + "drive/files/update": { + req: { + fileId: DriveFile["id"]; + folderId?: DriveFolder["id"] | null; + name?: string; + isSensitive?: boolean; + comment?: string | null; + }; + res: DriveFile; + }; + "drive/files/upload-from-url": { + req: { + url: string; + folderId?: DriveFolder["id"] | null; + isSensitive?: boolean; + comment?: string | null; + marker?: string | null; + force?: boolean; + }; + res: null; + }; + "drive/folders": { + req: { + folderId?: DriveFolder["id"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFolder[]; + }; + "drive/folders/create": { + req: { + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/folders/delete": { + req: { + folderId: DriveFolder["id"]; + }; + res: null; + }; + "drive/folders/find": { + req: { + name: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder[]; + }; + "drive/folders/show": { + req: { + folderId: DriveFolder["id"]; + }; + res: DriveFolder; + }; + "drive/folders/update": { + req: { + folderId: DriveFolder["id"]; + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/stream": { + req: { + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + endpoint: { + req: { + endpoint: string; + }; + res: { + params: { + name: string; + type: string; + }[]; + }; + }; + endpoints: { + req: NoParams; + res: string[]; + }; + "federation/dns": { + req: { + host: string; + }; + res: { + a: string[]; + aaaa: string[]; + cname: string[]; + txt: string[]; + }; + }; + "federation/followers": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/following": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/instances": { + req: { + host?: string | null; + blocked?: boolean | null; + notResponding?: boolean | null; + suspended?: boolean | null; + federating?: boolean | null; + subscribing?: boolean | null; + publishing?: boolean | null; + limit?: number; + offset?: number; + sort?: + | "+pubSub" + | "-pubSub" + | "+notes" + | "-notes" + | "+users" + | "-users" + | "+following" + | "-following" + | "+followers" + | "-followers" + | "+caughtAt" + | "-caughtAt" + | "+lastCommunicatedAt" + | "-lastCommunicatedAt" + | "+driveUsage" + | "-driveUsage" + | "+driveFiles" + | "-driveFiles"; + }; + res: Instance[]; + }; + "federation/show-instance": { + req: { + host: string; + }; + res: Instance; + }; + "federation/update-remote-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "federation/users": { + req: { + host: string; + limit?: number; + sinceId?: User["id"]; + untilId?: User["id"]; + }; + res: UserDetailed[]; + }; + "following/create": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/delete": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/accept": { + req: { + userId: User["id"]; + }; + res: null; + }; + "following/requests/cancel": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/list": { + req: NoParams; + res: FollowRequest[]; + }; + "following/requests/reject": { + req: { + userId: User["id"]; + }; + res: null; + }; + "gallery/featured": { + req: TODO; + res: TODO; + }; + "gallery/popular": { + req: TODO; + res: TODO; + }; + "gallery/posts": { + req: TODO; + res: TODO; + }; + "gallery/posts/create": { + req: TODO; + res: TODO; + }; + "gallery/posts/delete": { + req: { + postId: GalleryPost["id"]; + }; + res: null; + }; + "gallery/posts/like": { + req: TODO; + res: TODO; + }; + "gallery/posts/show": { + req: TODO; + res: TODO; + }; + "gallery/posts/unlike": { + req: TODO; + res: TODO; + }; + "gallery/posts/update": { + req: TODO; + res: TODO; + }; + "games/reversi/games": { + req: TODO; + res: TODO; + }; + "games/reversi/games/show": { + req: TODO; + res: TODO; + }; + "games/reversi/games/surrender": { + req: TODO; + res: TODO; + }; + "games/reversi/invitations": { + req: TODO; + res: TODO; + }; + "games/reversi/match": { + req: TODO; + res: TODO; + }; + "games/reversi/match/cancel": { + req: TODO; + res: TODO; + }; + "get-online-users-count": { + req: NoParams; + res: { + count: number; + }; + }; + "hashtags/list": { + req: TODO; + res: TODO; + }; + "hashtags/search": { + req: TODO; + res: TODO; + }; + "hashtags/show": { + req: TODO; + res: TODO; + }; + "hashtags/trend": { + req: TODO; + res: TODO; + }; + "hashtags/users": { + req: TODO; + res: TODO; + }; + i: { + req: NoParams; + res: User; + }; + "i/apps": { + req: TODO; + res: TODO; + }; + "i/authorized-apps": { + req: TODO; + res: TODO; + }; + "i/change-password": { + req: TODO; + res: TODO; + }; + "i/delete-account": { + req: { + password: string; + }; + res: null; + }; + "i/export-blocking": { + req: TODO; + res: TODO; + }; + "i/export-following": { + req: TODO; + res: TODO; + }; + "i/export-mute": { + req: TODO; + res: TODO; + }; + "i/export-notes": { + req: TODO; + res: TODO; + }; + "i/export-user-lists": { + req: TODO; + res: TODO; + }; + "i/favorites": { + req: { + limit?: number; + sinceId?: NoteFavorite["id"]; + untilId?: NoteFavorite["id"]; + }; + res: NoteFavorite[]; + }; + "i/gallery/likes": { + req: TODO; + res: TODO; + }; + "i/gallery/posts": { + req: TODO; + res: TODO; + }; + "i/get-word-muted-notes-count": { + req: TODO; + res: TODO; + }; + "i/import-following": { + req: TODO; + res: TODO; + }; + "i/import-user-lists": { + req: TODO; + res: TODO; + }; + "i/move": { + req: TODO; + res: TODO; + }; + "i/known-as": { + req: TODO; + res: TODO; + }; + "i/notifications": { + req: { + limit?: number; + sinceId?: Notification["id"]; + untilId?: Notification["id"]; + following?: boolean; + markAsRead?: boolean; + includeTypes?: Notification["type"][]; + excludeTypes?: Notification["type"][]; + }; + res: Notification[]; + }; + "i/page-likes": { + req: TODO; + res: TODO; + }; + "i/pages": { + req: TODO; + res: TODO; + }; + "i/pin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/read-all-messaging-messages": { + req: TODO; + res: TODO; + }; + "i/read-all-unread-notes": { + req: TODO; + res: TODO; + }; + "i/read-announcement": { + req: TODO; + res: TODO; + }; + "i/regenerate-token": { + req: { + password: string; + }; + res: null; + }; + "i/registry/get-all": { + req: { + scope?: string[]; + }; + res: Record<string, any>; + }; + "i/registry/get-detail": { + req: { + key: string; + scope?: string[]; + }; + res: { + updatedAt: DateString; + value: any; + }; + }; + "i/registry/get": { + req: { + key: string; + scope?: string[]; + }; + res: any; + }; + "i/registry/keys-with-type": { + req: { + scope?: string[]; + }; + res: Record< + string, + "null" | "array" | "number" | "string" | "boolean" | "object" + >; + }; + "i/registry/keys": { + req: { + scope?: string[]; + }; + res: string[]; + }; + "i/registry/remove": { + req: { + key: string; + scope?: string[]; + }; + res: null; + }; + "i/registry/scopes": { + req: NoParams; + res: string[][]; + }; + "i/registry/set": { + req: { + key: string; + value: any; + scope?: string[]; + }; + res: null; + }; + "i/revoke-token": { + req: TODO; + res: TODO; + }; + "i/signin-history": { + req: { + limit?: number; + sinceId?: Signin["id"]; + untilId?: Signin["id"]; + }; + res: Signin[]; + }; + "i/unpin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/update-email": { + req: { + password: string; + email?: string | null; + }; + res: MeDetailed; + }; + "i/update": { + req: { + name?: string | null; + description?: string | null; + lang?: string | null; + location?: string | null; + birthday?: string | null; + avatarId?: DriveFile["id"] | null; + bannerId?: DriveFile["id"] | null; + fields?: { + name: string; + value: string; + }[]; + isLocked?: boolean; + isExplorable?: boolean; + hideOnlineStatus?: boolean; + carefulBot?: boolean; + autoAcceptFollowed?: boolean; + noCrawle?: boolean; + preventAiLearning?: boolean; + isBot?: boolean; + isCat?: boolean; + injectFeaturedNote?: boolean; + receiveAnnouncementEmail?: boolean; + alwaysMarkNsfw?: boolean; + mutedWords?: string[][]; + mutingNotificationTypes?: Notification["type"][]; + emailNotificationTypes?: string[]; + }; + res: MeDetailed; + }; + "i/user-group-invites": { + req: TODO; + res: TODO; + }; + "i/2fa/done": { + req: TODO; + res: TODO; + }; + "i/2fa/key-done": { + req: TODO; + res: TODO; + }; + "i/2fa/password-less": { + req: TODO; + res: TODO; + }; + "i/2fa/register-key": { + req: TODO; + res: TODO; + }; + "i/2fa/register": { + req: TODO; + res: TODO; + }; + "i/2fa/update-key": { + req: TODO; + res: TODO; + }; + "i/2fa/remove-key": { + req: TODO; + res: TODO; + }; + "i/2fa/unregister": { + req: TODO; + res: TODO; + }; + "messaging/history": { + req: { + limit?: number; + group?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + limit?: number; + sinceId?: MessagingMessage["id"]; + untilId?: MessagingMessage["id"]; + markAsRead?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages/create": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + text?: string; + fileId?: DriveFile["id"]; + }; + res: MessagingMessage; + }; + "messaging/messages/delete": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + "messaging/messages/read": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + meta: { + req: { + detail?: boolean; + }; + res: { + $switch: { + $cases: [ + [ + { + detail: true; + }, + DetailedInstanceMetadata, + ], + [ + { + detail: false; + }, + LiteInstanceMetadata, + ], + [ + { + detail: boolean; + }, + LiteInstanceMetadata | DetailedInstanceMetadata, + ], + ]; + $default: LiteInstanceMetadata; + }; + }; + }; + "miauth/gen-token": { + req: TODO; + res: TODO; + }; + "mute/create": { + req: TODO; + res: TODO; + }; + "mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "mute/list": { + req: TODO; + res: TODO; + }; + "renote-mute/create": { + req: TODO; + res: TODO; + }; + "renote-mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "renote-mute/list": { + req: TODO; + res: TODO; + }; + "my/apps": { + req: TODO; + res: TODO; + }; + notes: { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/children": { + req: { + noteId: Note["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/clips": { + req: TODO; + res: TODO; + }; + "notes/conversation": { + req: TODO; + res: TODO; + }; + "notes/create": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/edit": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/favorites/create": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/favorites/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/featured": { + req: TODO; + res: Note[]; + }; + "notes/global-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/recommended-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/hybrid-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/local-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/mentions": { + req: { + following?: boolean; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/polls/recommendation": { + req: TODO; + res: TODO; + }; + "notes/polls/vote": { + req: { + noteId: Note["id"]; + choice: number; + }; + res: null; + }; + "notes/reactions": { + req: { + noteId: Note["id"]; + type?: string | null; + limit?: number; + }; + res: NoteReaction[]; + }; + "notes/reactions/create": { + req: { + noteId: Note["id"]; + reaction: string; + }; + res: null; + }; + "notes/reactions/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/renotes": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/replies": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/search-by-tag": { + req: TODO; + res: TODO; + }; + "notes/search": { + req: TODO; + res: TODO; + }; + "notes/show": { + req: { + noteId: Note["id"]; + }; + res: Note; + }; + "notes/state": { + req: TODO; + res: TODO; + }; + "notes/timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/unrenote": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/user-list-timeline": { + req: { + listId: UserList["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/watching/create": { + req: TODO; + res: TODO; + }; + "notes/watching/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notifications/create": { + req: { + body: string; + header?: string | null; + icon?: string | null; + }; + res: null; + }; + "notifications/mark-all-as-read": { + req: NoParams; + res: null; + }; + "notifications/read": { + req: { + notificationId: Notification["id"]; + }; + res: null; + }; + "page-push": { + req: { + pageId: Page["id"]; + event: string; + var?: any; + }; + res: null; + }; + "pages/create": { + req: TODO; + res: Page; + }; + "pages/delete": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/featured": { + req: NoParams; + res: Page[]; + }; + "pages/like": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/show": { + req: { + pageId?: Page["id"]; + name?: string; + username?: string; + }; + res: Page; + }; + "pages/unlike": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/update": { + req: TODO; + res: null; + }; + ping: { + req: NoParams; + res: { + pong: number; + }; + }; + "pinned-users": { + req: TODO; + res: TODO; + }; + "promo/read": { + req: TODO; + res: TODO; + }; + "request-reset-password": { + req: { + username: string; + email: string; + }; + res: null; + }; + "reset-password": { + req: { + token: string; + password: string; + }; + res: null; + }; + "room/show": { + req: TODO; + res: TODO; + }; + "room/update": { + req: TODO; + res: TODO; + }; + stats: { + req: NoParams; + res: Stats; + }; + "server-info": { + req: NoParams; + res: ServerInfo; + }; + "latest-version": { + req: NoParams; + res: TODO; + }; + "sw/register": { + req: TODO; + res: TODO; + }; + "username/available": { + req: { + username: string; + }; + res: { + available: boolean; + }; + }; + users: { + req: { + limit?: number; + offset?: number; + sort?: UserSorting; + origin?: OriginType; + }; + res: User[]; + }; + "users/clips": { + req: TODO; + res: TODO; + }; + "users/followers": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFollowerPopulated[]; + }; + "users/following": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "users/gallery/posts": { + req: TODO; + res: TODO; + }; + "users/get-frequently-replied-users": { + req: TODO; + res: TODO; + }; + "users/groups/create": { + req: TODO; + res: TODO; + }; + "users/groups/delete": { + req: { + groupId: UserGroup["id"]; + }; + res: null; + }; + "users/groups/invitations/accept": { + req: TODO; + res: TODO; + }; + "users/groups/invitations/reject": { + req: TODO; + res: TODO; + }; + "users/groups/invite": { + req: TODO; + res: TODO; + }; + "users/groups/joined": { + req: TODO; + res: TODO; + }; + "users/groups/owned": { + req: TODO; + res: TODO; + }; + "users/groups/pull": { + req: TODO; + res: TODO; + }; + "users/groups/show": { + req: TODO; + res: TODO; + }; + "users/groups/transfer": { + req: TODO; + res: TODO; + }; + "users/groups/update": { + req: TODO; + res: TODO; + }; + "users/lists/create": { + req: { + name: string; + }; + res: UserList; + }; + "users/lists/delete": { + req: { + listId: UserList["id"]; + }; + res: null; + }; + "users/lists/list": { + req: NoParams; + res: UserList[]; + }; + "users/lists/pull": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/push": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/show": { + req: { + listId: UserList["id"]; + }; + res: UserList; + }; + "users/lists/update": { + req: { + listId: UserList["id"]; + name: string; + }; + res: UserList; + }; + "users/notes": { + req: { + userId: User["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "users/pages": { + req: TODO; + res: TODO; + }; + "users/recommendation": { + req: TODO; + res: TODO; + }; + "users/relation": { + req: TODO; + res: TODO; + }; + "users/report-abuse": { + req: TODO; + res: TODO; + }; + "users/search-by-username-and-host": { + req: TODO; + res: TODO; + }; + "users/search": { + req: TODO; + res: TODO; + }; + "users/show": { + req: + | ShowUserReq + | { + userIds: User["id"][]; + }; + res: { + $switch: { + $cases: [ + [ + { + userIds: User["id"][]; + }, + UserDetailed[], + ], + ]; + $default: UserDetailed; + }; + }; + }; + "users/stats": { + req: TODO; + res: TODO; + }; +}; +``` +**References:** [User](./calckey-js.entities.user.md)<!-- -->, [Ad](./calckey-js.entities.ad.md)<!-- -->, [Announcement](./calckey-js.entities.announcement.md)<!-- -->, [Antenna](./calckey-js.entities.antenna.md)<!-- -->, [Note](./calckey-js.entities.note.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md)<!-- -->, [App](./calckey-js.entities.app.md)<!-- -->, [AuthSession](./calckey-js.entities.authsession.md)<!-- -->, [Blocking](./calckey-js.entities.blocking.md)<!-- -->, [Clip](./calckey-js.entities.clip.md)<!-- -->, [DriveFolder](./calckey-js.entities.drivefolder.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md)<!-- -->, [Following](./calckey-js.entities.following.md)<!-- -->, [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md)<!-- -->, [Instance](./calckey-js.entities.instance.md)<!-- -->, [FollowRequest](./calckey-js.entities.followrequest.md)<!-- -->, [GalleryPost](./calckey-js.entities.gallerypost.md)<!-- -->, [NoteFavorite](./calckey-js.entities.notefavorite.md)<!-- -->, [MeDetailed](./calckey-js.entities.medetailed.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [Signin](./calckey-js.entities.signin.md)<!-- -->, [MessagingMessage](./calckey-js.entities.messagingmessage.md)<!-- -->, [UserGroup](./calckey-js.entities.usergroup.md)<!-- -->, [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md)<!-- -->, [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md)<!-- -->, [NoteReaction](./calckey-js.entities.notereaction.md)<!-- -->, [UserList](./calckey-js.entities.userlist.md)<!-- -->, [Page](./calckey-js.entities.page.md)<!-- -->, [Stats](./calckey-js.entities.stats.md)<!-- -->, [ServerInfo](./calckey-js.entities.serverinfo.md)<!-- -->, [UserSorting](./calckey-js.entities.usersorting.md)<!-- -->, [OriginType](./calckey-js.entities.origintype.md)<!-- -->, [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.ad.md b/packages/calckey-js/markdown/calckey-js.entities.ad.md new file mode 100644 index 0000000000..83bc86e489 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.ad.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Ad](./calckey-js.entities.ad.md) + +## entities.Ad type + +**Signature:** + +```typescript +export declare type Ad = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.announcement.md b/packages/calckey-js/markdown/calckey-js.entities.announcement.md new file mode 100644 index 0000000000..09d572a584 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.announcement.md @@ -0,0 +1,21 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Announcement](./calckey-js.entities.announcement.md) + +## entities.Announcement type + +**Signature:** + +```typescript +export declare type Announcement = { + id: ID; + createdAt: DateString; + updatedAt: DateString | null; + text: string; + title: string; + imageUrl: string | null; + isRead?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.antenna.md b/packages/calckey-js/markdown/calckey-js.entities.antenna.md new file mode 100644 index 0000000000..7f05d15a82 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.antenna.md @@ -0,0 +1,29 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Antenna](./calckey-js.entities.antenna.md) + +## entities.Antenna type + +**Signature:** + +```typescript +export declare type Antenna = { + id: ID; + createdAt: DateString; + name: string; + keywords: string[][]; + excludeKeywords: string[][]; + src: "home" | "all" | "users" | "list" | "group" | "instances"; + userListId: ID | null; + userGroupId: ID | null; + users: string[]; + instances: string[]; + caseSensitive: boolean; + notify: boolean; + withReplies: boolean; + withFile: boolean; + hasUnreadNote: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.app.md b/packages/calckey-js/markdown/calckey-js.entities.app.md new file mode 100644 index 0000000000..4f31281e37 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.app.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [App](./calckey-js.entities.app.md) + +## entities.App type + +**Signature:** + +```typescript +export declare type App = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.authsession.md b/packages/calckey-js/markdown/calckey-js.entities.authsession.md new file mode 100644 index 0000000000..36ff409649 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.authsession.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [AuthSession](./calckey-js.entities.authsession.md) + +## entities.AuthSession type + +**Signature:** + +```typescript +export declare type AuthSession = { + id: ID; + app: App; + token: string; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [App](./calckey-js.entities.app.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.blocking.md b/packages/calckey-js/markdown/calckey-js.entities.blocking.md new file mode 100644 index 0000000000..6769b6475f --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.blocking.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Blocking](./calckey-js.entities.blocking.md) + +## entities.Blocking type + +**Signature:** + +```typescript +export declare type Blocking = { + id: ID; + createdAt: DateString; + blockeeId: User["id"]; + blockee: UserDetailed; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.channel.md b/packages/calckey-js/markdown/calckey-js.entities.channel.md new file mode 100644 index 0000000000..6f7d5f3b8f --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.channel.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Channel](./calckey-js.entities.channel.md) + +## entities.Channel type + +**Signature:** + +```typescript +export declare type Channel = { + id: ID; +}; +``` +**References:** [ID](./calckey-js.entities.id.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.clip.md b/packages/calckey-js/markdown/calckey-js.entities.clip.md new file mode 100644 index 0000000000..69607fb497 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.clip.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Clip](./calckey-js.entities.clip.md) + +## entities.Clip type + +**Signature:** + +```typescript +export declare type Clip = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.customemoji.md b/packages/calckey-js/markdown/calckey-js.entities.customemoji.md new file mode 100644 index 0000000000..834eb0ec22 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.customemoji.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [CustomEmoji](./calckey-js.entities.customemoji.md) + +## entities.CustomEmoji type + +**Signature:** + +```typescript +export declare type CustomEmoji = { + id: string; + name: string; + url: string; + category: string; + aliases: string[]; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.datestring.md b/packages/calckey-js/markdown/calckey-js.entities.datestring.md new file mode 100644 index 0000000000..20204330cb --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.datestring.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DateString](./calckey-js.entities.datestring.md) + +## entities.DateString type + +**Signature:** + +```typescript +export declare type DateString = string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md b/packages/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md new file mode 100644 index 0000000000..920e0bca94 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) + +## entities.DetailedInstanceMetadata type + +**Signature:** + +```typescript +export declare type DetailedInstanceMetadata = LiteInstanceMetadata & { + features: Record<string, any>; +}; +``` +**References:** [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.drivefile.md b/packages/calckey-js/markdown/calckey-js.entities.drivefile.md new file mode 100644 index 0000000000..eec361a9b8 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.drivefile.md @@ -0,0 +1,26 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DriveFile](./calckey-js.entities.drivefile.md) + +## entities.DriveFile type + +**Signature:** + +```typescript +export declare type DriveFile = { + id: ID; + createdAt: DateString; + isSensitive: boolean; + name: string; + thumbnailUrl: string; + url: string; + type: string; + size: number; + md5: string; + blurhash: string; + comment: string | null; + properties: Record<string, any>; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.drivefolder.md b/packages/calckey-js/markdown/calckey-js.entities.drivefolder.md new file mode 100644 index 0000000000..4d8c68e8bb --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.drivefolder.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DriveFolder](./calckey-js.entities.drivefolder.md) + +## entities.DriveFolder type + +**Signature:** + +```typescript +export declare type DriveFolder = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.following.md b/packages/calckey-js/markdown/calckey-js.entities.following.md new file mode 100644 index 0000000000..2c495d2fea --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.following.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Following](./calckey-js.entities.following.md) + +## entities.Following type + +**Signature:** + +```typescript +export declare type Following = { + id: ID; + createdAt: DateString; + followerId: User["id"]; + followeeId: User["id"]; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md b/packages/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md new file mode 100644 index 0000000000..f0000326a8 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md) + +## entities.FollowingFolloweePopulated type + +**Signature:** + +```typescript +export declare type FollowingFolloweePopulated = Following & { + followee: UserDetailed; +}; +``` +**References:** [Following](./calckey-js.entities.following.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md b/packages/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md new file mode 100644 index 0000000000..6f9860af8c --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) + +## entities.FollowingFollowerPopulated type + +**Signature:** + +```typescript +export declare type FollowingFollowerPopulated = Following & { + follower: UserDetailed; +}; +``` +**References:** [Following](./calckey-js.entities.following.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.followrequest.md b/packages/calckey-js/markdown/calckey-js.entities.followrequest.md new file mode 100644 index 0000000000..d7ff6bbef2 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.followrequest.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowRequest](./calckey-js.entities.followrequest.md) + +## entities.FollowRequest type + +**Signature:** + +```typescript +export declare type FollowRequest = { + id: ID; + follower: User; + followee: User; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [User](./calckey-js.entities.user.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.gallerypost.md b/packages/calckey-js/markdown/calckey-js.entities.gallerypost.md new file mode 100644 index 0000000000..a079955a91 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.gallerypost.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [GalleryPost](./calckey-js.entities.gallerypost.md) + +## entities.GalleryPost type + +**Signature:** + +```typescript +export declare type GalleryPost = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.id.md b/packages/calckey-js/markdown/calckey-js.entities.id.md new file mode 100644 index 0000000000..bf6e7f2911 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.id.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [ID](./calckey-js.entities.id.md) + +## entities.ID type + +**Signature:** + +```typescript +export declare type ID = string; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.instance.md b/packages/calckey-js/markdown/calckey-js.entities.instance.md new file mode 100644 index 0000000000..7e0fb6cc6c --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.instance.md @@ -0,0 +1,40 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Instance](./calckey-js.entities.instance.md) + +## entities.Instance type + +**Signature:** + +```typescript +export declare type Instance = { + id: ID; + caughtAt: DateString; + host: string; + usersCount: number; + notesCount: number; + followingCount: number; + followersCount: number; + driveUsage: number; + driveFiles: number; + latestRequestSentAt: DateString | null; + latestStatus: number | null; + latestRequestReceivedAt: DateString | null; + lastCommunicatedAt: DateString; + isNotResponding: boolean; + isSuspended: boolean; + softwareName: string | null; + softwareVersion: string | null; + openRegistrations: boolean | null; + name: string | null; + description: string | null; + maintainerName: string | null; + maintainerEmail: string | null; + iconUrl: string | null; + faviconUrl: string | null; + themeColor: string | null; + infoUpdatedAt: DateString | null; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.instancemetadata.md b/packages/calckey-js/markdown/calckey-js.entities.instancemetadata.md new file mode 100644 index 0000000000..54e399e4ee --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.instancemetadata.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [InstanceMetadata](./calckey-js.entities.instancemetadata.md) + +## entities.InstanceMetadata type + +**Signature:** + +```typescript +export declare type InstanceMetadata = + | LiteInstanceMetadata + | DetailedInstanceMetadata; +``` +**References:** [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md)<!-- -->, [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md b/packages/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md new file mode 100644 index 0000000000..51d21efcc9 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md @@ -0,0 +1,46 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) + +## entities.LiteInstanceMetadata type + +**Signature:** + +```typescript +export declare type LiteInstanceMetadata = { + maintainerName: string | null; + maintainerEmail: string | null; + version: string; + name: string | null; + uri: string; + description: string | null; + tosUrl: string | null; + disableRegistration: boolean; + disableLocalTimeline: boolean; + disableRecommendedTimeline: boolean; + disableGlobalTimeline: boolean; + driveCapacityPerLocalUserMb: number; + driveCapacityPerRemoteUserMb: number; + enableHcaptcha: boolean; + hcaptchaSiteKey: string | null; + enableRecaptcha: boolean; + recaptchaSiteKey: string | null; + swPublickey: string | null; + maxNoteTextLength: number; + enableEmail: boolean; + enableTwitterIntegration: boolean; + enableGithubIntegration: boolean; + enableDiscordIntegration: boolean; + enableServiceWorker: boolean; + emojis: CustomEmoji[]; + ads: { + id: ID; + ratio: number; + place: string; + url: string; + imageUrl: string; + }[]; +}; +``` +**References:** [CustomEmoji](./calckey-js.entities.customemoji.md)<!-- -->, [ID](./calckey-js.entities.id.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.md b/packages/calckey-js/markdown/calckey-js.entities.md new file mode 100644 index 0000000000..a909f1f36a --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.md @@ -0,0 +1,51 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) + +## entities namespace + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [Ad](./calckey-js.entities.ad.md) | | +| [Announcement](./calckey-js.entities.announcement.md) | | +| [Antenna](./calckey-js.entities.antenna.md) | | +| [App](./calckey-js.entities.app.md) | | +| [AuthSession](./calckey-js.entities.authsession.md) | | +| [Blocking](./calckey-js.entities.blocking.md) | | +| [Channel](./calckey-js.entities.channel.md) | | +| [Clip](./calckey-js.entities.clip.md) | | +| [CustomEmoji](./calckey-js.entities.customemoji.md) | | +| [DateString](./calckey-js.entities.datestring.md) | | +| [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) | | +| [DriveFile](./calckey-js.entities.drivefile.md) | | +| [DriveFolder](./calckey-js.entities.drivefolder.md) | | +| [Following](./calckey-js.entities.following.md) | | +| [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md) | | +| [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) | | +| [FollowRequest](./calckey-js.entities.followrequest.md) | | +| [GalleryPost](./calckey-js.entities.gallerypost.md) | | +| [ID](./calckey-js.entities.id.md) | | +| [Instance](./calckey-js.entities.instance.md) | | +| [InstanceMetadata](./calckey-js.entities.instancemetadata.md) | | +| [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) | | +| [MeDetailed](./calckey-js.entities.medetailed.md) | | +| [MessagingMessage](./calckey-js.entities.messagingmessage.md) | | +| [Note](./calckey-js.entities.note.md) | | +| [NoteFavorite](./calckey-js.entities.notefavorite.md) | | +| [NoteReaction](./calckey-js.entities.notereaction.md) | | +| [Notification](./calckey-js.entities.notification.md) | | +| [OriginType](./calckey-js.entities.origintype.md) | | +| [Page](./calckey-js.entities.page.md) | | +| [PageEvent](./calckey-js.entities.pageevent.md) | | +| [ServerInfo](./calckey-js.entities.serverinfo.md) | | +| [Signin](./calckey-js.entities.signin.md) | | +| [Stats](./calckey-js.entities.stats.md) | | +| [User](./calckey-js.entities.user.md) | | +| [UserDetailed](./calckey-js.entities.userdetailed.md) | | +| [UserGroup](./calckey-js.entities.usergroup.md) | | +| [UserList](./calckey-js.entities.userlist.md) | | +| [UserLite](./calckey-js.entities.userlite.md) | | +| [UserSorting](./calckey-js.entities.usersorting.md) | | + diff --git a/packages/calckey-js/markdown/calckey-js.entities.medetailed.md b/packages/calckey-js/markdown/calckey-js.entities.medetailed.md new file mode 100644 index 0000000000..625722acbe --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.medetailed.md @@ -0,0 +1,40 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [MeDetailed](./calckey-js.entities.medetailed.md) + +## entities.MeDetailed type + +**Signature:** + +```typescript +export declare type MeDetailed = UserDetailed & { + avatarId: DriveFile["id"]; + bannerId: DriveFile["id"]; + autoAcceptFollowed: boolean; + alwaysMarkNsfw: boolean; + carefulBot: boolean; + emailNotificationTypes: string[]; + hasPendingReceivedFollowRequest: boolean; + hasUnreadAnnouncement: boolean; + hasUnreadAntenna: boolean; + hasUnreadChannel: boolean; + hasUnreadMentions: boolean; + hasUnreadMessagingMessage: boolean; + hasUnreadNotification: boolean; + hasUnreadSpecifiedNotes: boolean; + hideOnlineStatus: boolean; + injectFeaturedNote: boolean; + integrations: Record<string, any>; + isDeleted: boolean; + isExplorable: boolean; + mutedWords: string[][]; + mutingNotificationTypes: string[]; + noCrawle: boolean; + preventAiLearning: boolean; + receiveAnnouncementEmail: boolean; + usePasswordLessLogin: boolean; + [other: string]: any; +}; +``` +**References:** [UserDetailed](./calckey-js.entities.userdetailed.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.messagingmessage.md b/packages/calckey-js/markdown/calckey-js.entities.messagingmessage.md new file mode 100644 index 0000000000..ab810b79a4 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.messagingmessage.md @@ -0,0 +1,27 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [MessagingMessage](./calckey-js.entities.messagingmessage.md) + +## entities.MessagingMessage type + +**Signature:** + +```typescript +export declare type MessagingMessage = { + id: ID; + createdAt: DateString; + file: DriveFile | null; + fileId: DriveFile["id"] | null; + isRead: boolean; + reads: User["id"][]; + text: string | null; + user: User; + userId: User["id"]; + recipient?: User | null; + recipientId: User["id"] | null; + group?: UserGroup | null; + groupId: UserGroup["id"] | null; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.note.md b/packages/calckey-js/markdown/calckey-js.entities.note.md new file mode 100644 index 0000000000..c648a7d053 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.note.md @@ -0,0 +1,51 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Note](./calckey-js.entities.note.md) + +## entities.Note type + +**Signature:** + +```typescript +export declare type Note = { + id: ID; + createdAt: DateString; + text: string | null; + cw: string | null; + user: User; + userId: User["id"]; + reply?: Note; + replyId: Note["id"]; + renote?: Note; + renoteId: Note["id"]; + files: DriveFile[]; + fileIds: DriveFile["id"][]; + visibility: "public" | "home" | "followers" | "specified"; + visibleUserIds?: User["id"][]; + localOnly?: boolean; + channel?: Channel["id"]; + myReaction?: string; + reactions: Record<string, number>; + renoteCount: number; + repliesCount: number; + poll?: { + expiresAt: DateString | null; + multiple: boolean; + choices: { + isVoted: boolean; + text: string; + votes: number; + }[]; + }; + emojis: { + name: string; + url: string; + }[]; + uri?: string; + url?: string; + updatedAt?: DateString; + isHidden?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [Note](./calckey-js.entities.note.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md)<!-- -->, [Channel](./calckey-js.entities.channel.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.notefavorite.md b/packages/calckey-js/markdown/calckey-js.entities.notefavorite.md new file mode 100644 index 0000000000..e61a826915 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.notefavorite.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [NoteFavorite](./calckey-js.entities.notefavorite.md) + +## entities.NoteFavorite type + +**Signature:** + +```typescript +export declare type NoteFavorite = { + id: ID; + createdAt: DateString; + noteId: Note["id"]; + note: Note; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [Note](./calckey-js.entities.note.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.notereaction.md b/packages/calckey-js/markdown/calckey-js.entities.notereaction.md new file mode 100644 index 0000000000..c458b9ae73 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.notereaction.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [NoteReaction](./calckey-js.entities.notereaction.md) + +## entities.NoteReaction type + +**Signature:** + +```typescript +export declare type NoteReaction = { + id: ID; + createdAt: DateString; + user: UserLite; + type: string; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [UserLite](./calckey-js.entities.userlite.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.notification.md b/packages/calckey-js/markdown/calckey-js.entities.notification.md new file mode 100644 index 0000000000..9d8af4dff5 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.notification.md @@ -0,0 +1,82 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Notification](./calckey-js.entities.notification.md) + +## entities.Notification type + +**Signature:** + +```typescript +export declare type Notification = { + id: ID; + createdAt: DateString; + isRead: boolean; +} & ( + | { + type: "reaction"; + reaction: string; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "reply"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "renote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "quote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "mention"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "pollVote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "follow"; + user: User; + userId: User["id"]; + } + | { + type: "followRequestAccepted"; + user: User; + userId: User["id"]; + } + | { + type: "receiveFollowRequest"; + user: User; + userId: User["id"]; + } + | { + type: "groupInvited"; + invitation: UserGroup; + user: User; + userId: User["id"]; + } + | { + type: "app"; + header?: string | null; + body: string; + icon?: string | null; + } +); +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [Note](./calckey-js.entities.note.md)<!-- -->, [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.origintype.md b/packages/calckey-js/markdown/calckey-js.entities.origintype.md new file mode 100644 index 0000000000..f00c0b915b --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.origintype.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [OriginType](./calckey-js.entities.origintype.md) + +## entities.OriginType type + +**Signature:** + +```typescript +export declare type OriginType = "combined" | "local" | "remote"; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.page.md b/packages/calckey-js/markdown/calckey-js.entities.page.md new file mode 100644 index 0000000000..3a24e45120 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.page.md @@ -0,0 +1,33 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Page](./calckey-js.entities.page.md) + +## entities.Page type + +**Signature:** + +```typescript +export declare type Page = { + id: ID; + createdAt: DateString; + updatedAt: DateString; + userId: User["id"]; + user: User; + content: Record<string, any>[]; + variables: Record<string, any>[]; + title: string; + name: string; + summary: string | null; + hideTitleWhenPinned: boolean; + alignCenter: boolean; + font: string; + script: string; + eyeCatchingImageId: DriveFile["id"] | null; + eyeCatchingImage: DriveFile | null; + attachedFiles: any; + likedCount: number; + isLiked?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md)<!-- -->, [DriveFile](./calckey-js.entities.drivefile.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.pageevent.md b/packages/calckey-js/markdown/calckey-js.entities.pageevent.md new file mode 100644 index 0000000000..f3cba25919 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.pageevent.md @@ -0,0 +1,19 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [PageEvent](./calckey-js.entities.pageevent.md) + +## entities.PageEvent type + +**Signature:** + +```typescript +export declare type PageEvent = { + pageId: Page["id"]; + event: string; + var: any; + userId: User["id"]; + user: User; +}; +``` +**References:** [Page](./calckey-js.entities.page.md)<!-- -->, [User](./calckey-js.entities.user.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.serverinfo.md b/packages/calckey-js/markdown/calckey-js.entities.serverinfo.md new file mode 100644 index 0000000000..9c2aadedc1 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.serverinfo.md @@ -0,0 +1,24 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [ServerInfo](./calckey-js.entities.serverinfo.md) + +## entities.ServerInfo type + +**Signature:** + +```typescript +export declare type ServerInfo = { + machine: string; + cpu: { + model: string; + cores: number; + }; + mem: { + total: number; + }; + fs: { + total: number; + used: number; + }; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.signin.md b/packages/calckey-js/markdown/calckey-js.entities.signin.md new file mode 100644 index 0000000000..56d7f26ad3 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.signin.md @@ -0,0 +1,19 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Signin](./calckey-js.entities.signin.md) + +## entities.Signin type + +**Signature:** + +```typescript +export declare type Signin = { + id: ID; + createdAt: DateString; + ip: string; + headers: Record<string, any>; + success: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.stats.md b/packages/calckey-js/markdown/calckey-js.entities.stats.md new file mode 100644 index 0000000000..1067e1a27d --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.stats.md @@ -0,0 +1,19 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Stats](./calckey-js.entities.stats.md) + +## entities.Stats type + +**Signature:** + +```typescript +export declare type Stats = { + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + instances: number; + driveUsageLocal: number; + driveUsageRemote: number; +}; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.user.md b/packages/calckey-js/markdown/calckey-js.entities.user.md new file mode 100644 index 0000000000..663daaaf38 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.user.md @@ -0,0 +1,13 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [User](./calckey-js.entities.user.md) + +## entities.User type + +**Signature:** + +```typescript +export declare type User = UserLite | UserDetailed; +``` +**References:** [UserLite](./calckey-js.entities.userlite.md)<!-- -->, [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.userdetailed.md b/packages/calckey-js/markdown/calckey-js.entities.userdetailed.md new file mode 100644 index 0000000000..cce30a85c9 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.userdetailed.md @@ -0,0 +1,56 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserDetailed](./calckey-js.entities.userdetailed.md) + +## entities.UserDetailed type + +**Signature:** + +```typescript +export declare type UserDetailed = UserLite & { + bannerBlurhash: string | null; + bannerColor: string | null; + bannerUrl: string | null; + birthday: string | null; + createdAt: DateString; + description: string | null; + ffVisibility: "public" | "followers" | "private"; + fields: { + name: string; + value: string; + }[]; + followersCount: number; + followingCount: number; + hasPendingFollowRequestFromYou: boolean; + hasPendingFollowRequestToYou: boolean; + isAdmin: boolean; + isBlocked: boolean; + isBlocking: boolean; + isBot: boolean; + isCat: boolean; + isFollowed: boolean; + isFollowing: boolean; + isLocked: boolean; + isModerator: boolean; + isMuted: boolean; + isRenoteMuted: boolean; + isSilenced: boolean; + isSuspended: boolean; + lang: string | null; + lastFetchedAt?: DateString; + location: string | null; + notesCount: number; + pinnedNoteIds: ID[]; + pinnedNotes: Note[]; + pinnedPage: Page | null; + pinnedPageId: string | null; + publicReactions: boolean; + securityKeys: boolean; + twoFactorEnabled: boolean; + updatedAt: DateString | null; + uri: string | null; + url: string | null; +}; +``` +**References:** [UserLite](./calckey-js.entities.userlite.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [ID](./calckey-js.entities.id.md)<!-- -->, [Note](./calckey-js.entities.note.md)<!-- -->, [Page](./calckey-js.entities.page.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.usergroup.md b/packages/calckey-js/markdown/calckey-js.entities.usergroup.md new file mode 100644 index 0000000000..16bb9076bf --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.usergroup.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserGroup](./calckey-js.entities.usergroup.md) + +## entities.UserGroup type + +**Signature:** + +```typescript +export declare type UserGroup = TODO; +``` diff --git a/packages/calckey-js/markdown/calckey-js.entities.userlist.md b/packages/calckey-js/markdown/calckey-js.entities.userlist.md new file mode 100644 index 0000000000..6ba539c662 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.userlist.md @@ -0,0 +1,18 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserList](./calckey-js.entities.userlist.md) + +## entities.UserList type + +**Signature:** + +```typescript +export declare type UserList = { + id: ID; + createdAt: DateString; + name: string; + userIds: User["id"][]; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [DateString](./calckey-js.entities.datestring.md)<!-- -->, [User](./calckey-js.entities.user.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.userlite.md b/packages/calckey-js/markdown/calckey-js.entities.userlite.md new file mode 100644 index 0000000000..157b7b48a2 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.userlite.md @@ -0,0 +1,35 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserLite](./calckey-js.entities.userlite.md) + +## entities.UserLite type + +**Signature:** + +```typescript +export declare type UserLite = { + id: ID; + username: string; + host: string | null; + name: string; + onlineStatus: "online" | "active" | "offline" | "unknown"; + avatarUrl: string; + avatarBlurhash: string; + alsoKnownAs: string[]; + movedToUri: any; + emojis: { + name: string; + url: string; + }[]; + instance?: { + name: Instance["name"]; + softwareName: Instance["softwareName"]; + softwareVersion: Instance["softwareVersion"]; + iconUrl: Instance["iconUrl"]; + faviconUrl: Instance["faviconUrl"]; + themeColor: Instance["themeColor"]; + }; +}; +``` +**References:** [ID](./calckey-js.entities.id.md)<!-- -->, [Instance](./calckey-js.entities.instance.md) + diff --git a/packages/calckey-js/markdown/calckey-js.entities.usersorting.md b/packages/calckey-js/markdown/calckey-js.entities.usersorting.md new file mode 100644 index 0000000000..54c3e9783f --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.entities.usersorting.md @@ -0,0 +1,17 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserSorting](./calckey-js.entities.usersorting.md) + +## entities.UserSorting type + +**Signature:** + +```typescript +export declare type UserSorting = + | "+follower" + | "-follower" + | "+createdAt" + | "-createdAt" + | "+updatedAt" + | "-updatedAt"; +``` diff --git a/packages/calckey-js/markdown/calckey-js.ffvisibility.md b/packages/calckey-js/markdown/calckey-js.ffvisibility.md new file mode 100644 index 0000000000..df08c489c7 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.ffvisibility.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ffVisibility](./calckey-js.ffvisibility.md) + +## ffVisibility variable + +**Signature:** + +```typescript +ffVisibility: readonly ["public", "followers", "private"] +``` diff --git a/packages/calckey-js/markdown/calckey-js.md b/packages/calckey-js/markdown/calckey-js.md new file mode 100644 index 0000000000..1674ddd5a6 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.md @@ -0,0 +1,43 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) + +## calckey-js package + +## Classes + +| Class | Description | +| --- | --- | +| [Stream](./calckey-js.stream.md) | | + +## Abstract Classes + +| Abstract Class | Description | +| --- | --- | +| [ChannelConnection](./calckey-js.channelconnection.md) | | + +## Namespaces + +| Namespace | Description | +| --- | --- | +| [api](./calckey-js.api.md) | | +| [entities](./calckey-js.entities.md) | | + +## Variables + +| Variable | Description | +| --- | --- | +| [ffVisibility](./calckey-js.ffvisibility.md) | | +| [mutedNoteReasons](./calckey-js.mutednotereasons.md) | | +| [noteVisibilities](./calckey-js.notevisibilities.md) | | +| [notificationTypes](./calckey-js.notificationtypes.md) | | +| [permissions](./calckey-js.permissions.md) | | + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [Acct](./calckey-js.acct.md) | | +| [Channels](./calckey-js.channels.md) | | +| [Endpoints](./calckey-js.endpoints.md) | | + diff --git a/packages/calckey-js/markdown/calckey-js.mutednotereasons.md b/packages/calckey-js/markdown/calckey-js.mutednotereasons.md new file mode 100644 index 0000000000..c518ae8704 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.mutednotereasons.md @@ -0,0 +1,16 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [mutedNoteReasons](./calckey-js.mutednotereasons.md) + +## mutedNoteReasons variable + +**Signature:** + +```typescript +mutedNoteReasons: readonly [ + "word", + "manual", + "spam", + "other", +] +``` diff --git a/packages/calckey-js/markdown/calckey-js.notevisibilities.md b/packages/calckey-js/markdown/calckey-js.notevisibilities.md new file mode 100644 index 0000000000..a18247abb1 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.notevisibilities.md @@ -0,0 +1,16 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [noteVisibilities](./calckey-js.notevisibilities.md) + +## noteVisibilities variable + +**Signature:** + +```typescript +noteVisibilities: readonly [ + "public", + "home", + "followers", + "specified", +] +``` diff --git a/packages/calckey-js/markdown/calckey-js.notificationtypes.md b/packages/calckey-js/markdown/calckey-js.notificationtypes.md new file mode 100644 index 0000000000..01d9ae3524 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.notificationtypes.md @@ -0,0 +1,24 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [notificationTypes](./calckey-js.notificationtypes.md) + +## notificationTypes variable + +**Signature:** + +```typescript +notificationTypes: readonly [ + "follow", + "mention", + "reply", + "renote", + "quote", + "reaction", + "pollVote", + "pollEnded", + "receiveFollowRequest", + "followRequestAccepted", + "groupInvited", + "app", +] +``` diff --git a/packages/calckey-js/markdown/calckey-js.permissions.md b/packages/calckey-js/markdown/calckey-js.permissions.md new file mode 100644 index 0000000000..6adcb917c7 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.permissions.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [permissions](./calckey-js.permissions.md) + +## permissions variable + +**Signature:** + +```typescript +permissions: string[] +``` diff --git a/packages/calckey-js/markdown/calckey-js.stream._constructor_.md b/packages/calckey-js/markdown/calckey-js.stream._constructor_.md new file mode 100644 index 0000000000..c6ab764983 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream._constructor_.md @@ -0,0 +1,30 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [(constructor)](./calckey-js.stream._constructor_.md) + +## Stream.(constructor) + +Constructs a new instance of the `Stream` class + +**Signature:** + +```typescript +constructor( + origin: string, + user: { + token: string; + } | null, + options?: { + WebSocket?: any; + }, + ); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| origin | string | | +| user | { token: string; } \| null | | +| options | { WebSocket?: any; } | _(Optional)_ | + diff --git a/packages/calckey-js/markdown/calckey-js.stream.close.md b/packages/calckey-js/markdown/calckey-js.stream.close.md new file mode 100644 index 0000000000..222c4ae8ac --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.close.md @@ -0,0 +1,15 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [close](./calckey-js.stream.close.md) + +## Stream.close() method + +**Signature:** + +```typescript +close(): void; +``` +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md b/packages/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md new file mode 100644 index 0000000000..2403a0d5de --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [disconnectToChannel](./calckey-js.stream.disconnecttochannel.md) + +## Stream.disconnectToChannel() method + +**Signature:** + +```typescript +disconnectToChannel(connection: NonSharedConnection): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| connection | NonSharedConnection | | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.md b/packages/calckey-js/markdown/calckey-js.stream.md new file mode 100644 index 0000000000..6c44402f56 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.md @@ -0,0 +1,36 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) + +## Stream class + +**Signature:** + +```typescript +export default class Stream extends EventEmitter<StreamEvents> +``` +**Extends:** EventEmitter<StreamEvents> + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(origin, user, options)](./calckey-js.stream._constructor_.md) | | Constructs a new instance of the <code>Stream</code> class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [state](./calckey-js.stream.state.md) | | "initializing" \| "reconnecting" \| "connected" | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [close()](./calckey-js.stream.close.md) | | | +| [disconnectToChannel(connection)](./calckey-js.stream.disconnecttochannel.md) | | | +| [removeSharedConnection(connection)](./calckey-js.stream.removesharedconnection.md) | | | +| [removeSharedConnectionPool(pool)](./calckey-js.stream.removesharedconnectionpool.md) | | | +| [send(typeOrPayload, payload)](./calckey-js.stream.send.md) | | | +| [useChannel(channel, params, name)](./calckey-js.stream.usechannel.md) | | | + diff --git a/packages/calckey-js/markdown/calckey-js.stream.removesharedconnection.md b/packages/calckey-js/markdown/calckey-js.stream.removesharedconnection.md new file mode 100644 index 0000000000..b52ce862e3 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.removesharedconnection.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [removeSharedConnection](./calckey-js.stream.removesharedconnection.md) + +## Stream.removeSharedConnection() method + +**Signature:** + +```typescript +removeSharedConnection(connection: SharedConnection): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| connection | SharedConnection | | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md b/packages/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md new file mode 100644 index 0000000000..aa99153734 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md @@ -0,0 +1,22 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [removeSharedConnectionPool](./calckey-js.stream.removesharedconnectionpool.md) + +## Stream.removeSharedConnectionPool() method + +**Signature:** + +```typescript +removeSharedConnectionPool(pool: Pool): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| pool | Pool | | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.send.md b/packages/calckey-js/markdown/calckey-js.stream.send.md new file mode 100644 index 0000000000..d8e03032d5 --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.send.md @@ -0,0 +1,23 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [send](./calckey-js.stream.send.md) + +## Stream.send() method + +**Signature:** + +```typescript +send(typeOrPayload: any, payload?: any): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| typeOrPayload | any | | +| payload | any | _(Optional)_ | + +**Returns:** + +void + diff --git a/packages/calckey-js/markdown/calckey-js.stream.state.md b/packages/calckey-js/markdown/calckey-js.stream.state.md new file mode 100644 index 0000000000..82c2e3c3ed --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.state.md @@ -0,0 +1,11 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [state](./calckey-js.stream.state.md) + +## Stream.state property + +**Signature:** + +```typescript +state: "initializing" | "reconnecting" | "connected"; +``` diff --git a/packages/calckey-js/markdown/calckey-js.stream.usechannel.md b/packages/calckey-js/markdown/calckey-js.stream.usechannel.md new file mode 100644 index 0000000000..b3c4abbf7c --- /dev/null +++ b/packages/calckey-js/markdown/calckey-js.stream.usechannel.md @@ -0,0 +1,28 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [useChannel](./calckey-js.stream.usechannel.md) + +## Stream.useChannel() method + +**Signature:** + +```typescript +useChannel<C extends keyof Channels>( + channel: C, + params?: Channels[C]["params"], + name?: string, + ): Connection<Channels[C]>; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| channel | C | | +| params | [Channels](./calckey-js.channels.md)<!-- -->\[C\]\["params"\] | _(Optional)_ | +| name | string | _(Optional)_ | + +**Returns:** + +[Connection](./calckey-js.channelconnection.md)<!-- --><[Channels](./calckey-js.channels.md)<!-- -->\[C\]> + diff --git a/packages/calckey-js/markdown/index.md b/packages/calckey-js/markdown/index.md new file mode 100644 index 0000000000..73dd95deb3 --- /dev/null +++ b/packages/calckey-js/markdown/index.md @@ -0,0 +1,12 @@ +<!-- Do not edit this file. It is automatically generated by API Documenter. --> + +[Home](./index.md) + +## API Reference + +## Packages + +| Package | Description | +| --- | --- | +| [calckey-js](./calckey-js.md) | | + diff --git a/packages/calckey-js/package-lock.json b/packages/calckey-js/package-lock.json deleted file mode 100644 index 774fcd5fa6..0000000000 --- a/packages/calckey-js/package-lock.json +++ /dev/null @@ -1,10662 +0,0 @@ -{ - "name": "calckey-js", - "version": "0.0.16", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "calckey-js", - "version": "0.0.16", - "dependencies": { - "autobind-decorator": "^2.4.0", - "eventemitter3": "^4.0.7", - "reconnecting-websocket": "^4.4.0", - "semver": "^7.3.8" - }, - "devDependencies": { - "@microsoft/api-extractor": "^7.19.3", - "@types/jest": "^27.4.0", - "@types/node": "17.0.5", - "@typescript-eslint/eslint-plugin": "5.8.1", - "@typescript-eslint/parser": "5.8.1", - "eslint": "8.6.0", - "jest": "^27.4.5", - "jest-fetch-mock": "^3.0.3", - "jest-websocket-mock": "^2.2.1", - "mock-socket": "^9.0.8", - "ts-jest": "^27.1.2", - "ts-node": "10.4.0", - "tsd": "^0.19.1", - "typescript": "4.5.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", - "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", - "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", - "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz", - "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", - "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.4.2", - "jest-util": "^27.4.2", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz", - "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.5", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.5", - "jest-haste-map": "^27.4.5", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-resolve-dependencies": "^27.4.5", - "jest-runner": "^27.4.5", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "jest-watcher": "^27.4.2", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz", - "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", - "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz", - "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.4.4", - "@jest/types": "^27.4.2", - "expect": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz", - "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.5", - "jest-resolve": "^27.4.5", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/source-map": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", - "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", - "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", - "dev": true, - "dependencies": { - "@jest/console": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz", - "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-runtime": "^27.4.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz", - "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.4.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-regex-util": "^27.4.0", - "jest-util": "^27.4.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@microsoft/api-extractor": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.3.tgz", - "integrity": "sha512-GZe+R3K4kh2X425iOHkPbByysB7FN0592mPPA6vNj5IhyhlPHgdZS6m6AmOZOIxMS4euM+SBKzEJEp3oC+WsOQ==", - "dev": true, - "dependencies": { - "@microsoft/api-extractor-model": "7.15.2", - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.44.3", - "@rushstack/rig-package": "0.3.7", - "@rushstack/ts-command-line": "4.10.6", - "colors": "~1.2.1", - "lodash": "~4.17.15", - "resolve": "~1.17.0", - "semver": "~7.3.0", - "source-map": "~0.6.1", - "typescript": "~4.5.2" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.15.2.tgz", - "integrity": "sha512-qgxKX/s6vo3nCVLhP0Ds7555QrErhcYHEok5/KyEZ7iR8J5M5oldD1eJJQmtEdVF5IzmnPPbxx1nRvfgA674LQ==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.44.3" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", - "dev": true - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.13.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rushstack/node-core-library": { - "version": "3.44.3", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.44.3.tgz", - "integrity": "sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w==", - "dev": true, - "dependencies": { - "@types/node": "12.20.24", - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.17.0", - "semver": "~7.3.0", - "timsort": "~0.3.0", - "z-schema": "~5.0.2" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/@types/node": { - "version": "12.20.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", - "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", - "dev": true - }, - "node_modules/@rushstack/node-core-library/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@rushstack/rig-package": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.7.tgz", - "integrity": "sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==", - "dev": true, - "dependencies": { - "resolve": "~1.17.0", - "strip-json-comments": "~3.1.1" - } - }, - "node_modules/@rushstack/rig-package/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.6.tgz", - "integrity": "sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==", - "dev": true, - "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "node_modules/@tsd/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-iDlLkdg3sCjUSNdoUCsYM/SXheHrdxHsR6msIkbFDW4pV6gHTMwg/8te/paLtywDjGL4S4ByDdUKA3RbfdBX0g==", - "dev": true, - "bin": { - "tsc": "typescript/bin/tsc", - "tsserver": "typescript/bin/tsserver" - } - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", - "dev": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz", - "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==", - "dev": true, - "dependencies": { - "jest-diff": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", - "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", - "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.1.tgz", - "integrity": "sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "5.8.1", - "@typescript-eslint/scope-manager": "5.8.1", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.1.tgz", - "integrity": "sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.8.1", - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/typescript-estree": "5.8.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.1.tgz", - "integrity": "sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.8.1", - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/typescript-estree": "5.8.1", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.1.tgz", - "integrity": "sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/visitor-keys": "5.8.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.1.tgz", - "integrity": "sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.1.tgz", - "integrity": "sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/visitor-keys": "5.8.1", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.1.tgz", - "integrity": "sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.8.1", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/autobind-decorator": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/autobind-decorator/-/autobind-decorator-2.4.0.tgz", - "integrity": "sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw==", - "engines": { - "node": ">=8.10", - "npm": ">=6.4.1" - } - }, - "node_modules/babel-jest": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz", - "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==", - "dev": true, - "dependencies": { - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.4.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", - "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", - "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^27.4.0", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001294", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz", - "integrity": "sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.31", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.31.tgz", - "integrity": "sha512-t3XVQtk+Frkv6aTD4RRk0OqosU+VLe1dQFW83MDer78ZD6a52frgXuYOIsLYTQiH2Lm+JB2OKYcn7zrX+YGAiQ==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-formatter-pretty": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", - "dev": true, - "dependencies": { - "@types/eslint": "^7.2.13", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.5", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-rule-docs": { - "version": "1.1.231", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.231.tgz", - "integrity": "sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==", - "dev": true - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", - "dev": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", - "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", - "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", - "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz", - "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==", - "dev": true, - "dependencies": { - "@jest/core": "^27.4.5", - "import-local": "^3.0.2", - "jest-cli": "^27.4.5" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", - "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz", - "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.4.4", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz", - "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==", - "dev": true, - "dependencies": { - "@jest/core": "^27.4.5", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz", - "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.5", - "@jest/types": "^27.4.2", - "babel-jest": "^27.4.5", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.5", - "jest-environment-jsdom": "^27.4.4", - "jest-environment-node": "^27.4.4", - "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.5", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-runner": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", - "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", - "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", - "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz", - "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.4.4", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz", - "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.4.4", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "dependencies": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "node_modules/jest-get-type": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", - "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.4.0", - "jest-serializer": "^27.4.0", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz", - "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.4", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", - "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", - "dev": true, - "dependencies": { - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", - "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", - "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-mock": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", - "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", - "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz", - "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz", - "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz", - "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==", - "dev": true, - "dependencies": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.4", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.4", - "jest-environment-node": "^27.4.4", - "jest-haste-map": "^27.4.5", - "jest-leak-detector": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.5", - "jest-runtime": "^27.4.5", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz", - "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.4", - "@jest/globals": "^27.4.4", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.2.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-serializer": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", - "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz", - "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.5", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.5", - "jest-util": "^27.4.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.4.2", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", - "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.4", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", - "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "leven": "^3.1.0", - "pretty-format": "^27.4.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", - "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.4.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-websocket-mock": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.2.1.tgz", - "integrity": "sha512-fhsGLXrPfs06PhHoxqOSA9yZ6Rb4qYrf4Wcm7/nfRzjlrf1gIeuhYUkzMRjjE0TMQ37SwkmeLanwrZY4ZaNp8g==", - "dev": true, - "dependencies": { - "jest-diff": "^27.0.2" - }, - "peerDependencies": { - "mock-socket": "^8||^9" - } - }, - "node_modules/jest-worker": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", - "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mock-socket": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.0.8.tgz", - "integrity": "sha512-8Syqkaaa2SzRqW68DEsnZkKQicHP7hVzfj3uCvigB5TL79H1ljKbwmOcRIENkx0ZTyu/5W6u+Pk9Qy6JCp38Ww==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "dependencies": { - "irregular-plurals": "^3.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", - "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.4.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-polyfill": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", - "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==", - "dev": true - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reconnecting-websocket": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", - "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-jest": { - "version": "27.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.2.tgz", - "integrity": "sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@types/jest": "^27.0.0", - "babel-jest": ">=27.0.0 <28", - "esbuild": "~0.14.0", - "jest": "^27.0.0", - "typescript": ">=3.8 <5.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tsd": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.19.1.tgz", - "integrity": "sha512-pSwchclr+ADdxlahRUQXUrdAIOjXx1T1PQV+fLfVLuo/S4z+T00YU84fH8iPlZxyA2pWgJjo42BG1p9SDb4NOw==", - "dev": true, - "dependencies": { - "@tsd/typescript": "~4.5.2", - "eslint-formatter-pretty": "^4.1.0", - "globby": "^11.0.1", - "meow": "^9.0.0", - "path-exists": "^4.0.0", - "read-pkg-up": "^7.0.0" - }, - "bin": { - "tsd": "dist/cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", - "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/z-schema": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.2.tgz", - "integrity": "sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==", - "dev": true, - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^2.7.1" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true - }, - "@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.7.tgz", - "integrity": "sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.7.tgz", - "integrity": "sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.7.tgz", - "integrity": "sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.7.tgz", - "integrity": "sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.2.tgz", - "integrity": "sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.4.2", - "jest-util": "^27.4.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.5.tgz", - "integrity": "sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/reporters": "^27.4.5", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.4.2", - "jest-config": "^27.4.5", - "jest-haste-map": "^27.4.5", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-resolve-dependencies": "^27.4.5", - "jest-runner": "^27.4.5", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "jest-watcher": "^27.4.2", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.4.tgz", - "integrity": "sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2" - } - }, - "@jest/fake-timers": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.2.tgz", - "integrity": "sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - } - }, - "@jest/globals": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.4.tgz", - "integrity": "sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.4", - "@jest/types": "^27.4.2", - "expect": "^27.4.2" - } - }, - "@jest/reporters": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.5.tgz", - "integrity": "sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.4.2", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.4.5", - "jest-resolve": "^27.4.5", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - } - }, - "@jest/source-map": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz", - "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.2.tgz", - "integrity": "sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz", - "integrity": "sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-runtime": "^27.4.5" - } - }, - "@jest/transform": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.5.tgz", - "integrity": "sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.4.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-regex-util": "^27.4.0", - "jest-util": "^27.4.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@microsoft/api-extractor": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.19.3.tgz", - "integrity": "sha512-GZe+R3K4kh2X425iOHkPbByysB7FN0592mPPA6vNj5IhyhlPHgdZS6m6AmOZOIxMS4euM+SBKzEJEp3oC+WsOQ==", - "dev": true, - "requires": { - "@microsoft/api-extractor-model": "7.15.2", - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.44.3", - "@rushstack/rig-package": "0.3.7", - "@rushstack/ts-command-line": "4.10.6", - "colors": "~1.2.1", - "lodash": "~4.17.15", - "resolve": "~1.17.0", - "semver": "~7.3.0", - "source-map": "~0.6.1", - "typescript": "~4.5.2" - }, - "dependencies": { - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "@microsoft/api-extractor-model": { - "version": "7.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.15.2.tgz", - "integrity": "sha512-qgxKX/s6vo3nCVLhP0Ds7555QrErhcYHEok5/KyEZ7iR8J5M5oldD1eJJQmtEdVF5IzmnPPbxx1nRvfgA674LQ==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "0.13.2", - "@microsoft/tsdoc-config": "~0.15.2", - "@rushstack/node-core-library": "3.44.3" - } - }, - "@microsoft/tsdoc": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", - "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", - "dev": true - }, - "@microsoft/tsdoc-config": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", - "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "0.13.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - }, - "dependencies": { - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, - "@rushstack/node-core-library": { - "version": "3.44.3", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.44.3.tgz", - "integrity": "sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w==", - "dev": true, - "requires": { - "@types/node": "12.20.24", - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.17.0", - "semver": "~7.3.0", - "timsort": "~0.3.0", - "z-schema": "~5.0.2" - }, - "dependencies": { - "@types/node": { - "version": "12.20.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", - "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "@rushstack/rig-package": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.7.tgz", - "integrity": "sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==", - "dev": true, - "requires": { - "resolve": "~1.17.0", - "strip-json-comments": "~3.1.1" - }, - "dependencies": { - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "@rushstack/ts-command-line": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.6.tgz", - "integrity": "sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==", - "dev": true, - "requires": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@tsd/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-iDlLkdg3sCjUSNdoUCsYM/SXheHrdxHsR6msIkbFDW4pV6gHTMwg/8te/paLtywDjGL4S4ByDdUKA3RbfdBX0g==", - "dev": true - }, - "@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.18", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", - "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", - "dev": true - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz", - "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==", - "dev": true, - "requires": { - "jest-diff": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/node": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", - "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/prettier": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.2.tgz", - "integrity": "sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.1.tgz", - "integrity": "sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.8.1", - "@typescript-eslint/scope-manager": "5.8.1", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.1.tgz", - "integrity": "sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.8.1", - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/typescript-estree": "5.8.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.1.tgz", - "integrity": "sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.8.1", - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/typescript-estree": "5.8.1", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.1.tgz", - "integrity": "sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/visitor-keys": "5.8.1" - } - }, - "@typescript-eslint/types": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.1.tgz", - "integrity": "sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.1.tgz", - "integrity": "sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.8.1", - "@typescript-eslint/visitor-keys": "5.8.1", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.1.tgz", - "integrity": "sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.8.1", - "eslint-visitor-keys": "^3.0.0" - } - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "autobind-decorator": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/autobind-decorator/-/autobind-decorator-2.4.0.tgz", - "integrity": "sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw==" - }, - "babel-jest": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.5.tgz", - "integrity": "sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA==", - "dev": true, - "requires": { - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.4.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz", - "integrity": "sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz", - "integrity": "sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.4.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30001294", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz", - "integrity": "sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g==", - "dev": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "dev": true, - "requires": { - "node-fetch": "2.6.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "electron-to-chromium": { - "version": "1.4.31", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.31.tgz", - "integrity": "sha512-t3XVQtk+Frkv6aTD4RRk0OqosU+VLe1dQFW83MDer78ZD6a52frgXuYOIsLYTQiH2Lm+JB2OKYcn7zrX+YGAiQ==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "eslint-formatter-pretty": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", - "dev": true, - "requires": { - "@types/eslint": "^7.2.13", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.5", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - } - }, - "eslint-rule-docs": { - "version": "1.1.231", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.231.tgz", - "integrity": "sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true - }, - "espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expect": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.2.tgz", - "integrity": "sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-regex-util": "^27.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "import-local": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", - "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", - "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.4.5.tgz", - "integrity": "sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==", - "dev": true, - "requires": { - "@jest/core": "^27.4.5", - "import-local": "^3.0.2", - "jest-cli": "^27.4.5" - } - }, - "jest-changed-files": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz", - "integrity": "sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.5.tgz", - "integrity": "sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.4", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - } - }, - "jest-cli": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.5.tgz", - "integrity": "sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg==", - "dev": true, - "requires": { - "@jest/core": "^27.4.5", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - } - }, - "jest-config": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.4.5.tgz", - "integrity": "sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.4.5", - "@jest/types": "^27.4.2", - "babel-jest": "^27.4.5", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-circus": "^27.4.5", - "jest-environment-jsdom": "^27.4.4", - "jest-environment-node": "^27.4.4", - "jest-get-type": "^27.4.0", - "jest-jasmine2": "^27.4.5", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-runner": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0" - } - }, - "jest-diff": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.2.tgz", - "integrity": "sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-docblock": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz", - "integrity": "sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.4.2.tgz", - "integrity": "sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2" - } - }, - "jest-environment-jsdom": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz", - "integrity": "sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.4", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.4.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.4.tgz", - "integrity": "sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA==", - "dev": true, - "requires": { - "@jest/environment": "^27.4.4", - "@jest/fake-timers": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "jest-mock": "^27.4.2", - "jest-util": "^27.4.2" - } - }, - "jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "requires": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "jest-get-type": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "dev": true - }, - "jest-haste-map": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.5.tgz", - "integrity": "sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.4.0", - "jest-serializer": "^27.4.0", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz", - "integrity": "sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.4.4", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.4.2", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-runtime": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "pretty-format": "^27.4.2", - "throat": "^6.0.1" - } - }, - "jest-leak-detector": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", - "integrity": "sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw==", - "dev": true, - "requires": { - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-matcher-utils": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz", - "integrity": "sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.2" - } - }, - "jest-message-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.2.tgz", - "integrity": "sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.2.tgz", - "integrity": "sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz", - "integrity": "sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==", - "dev": true - }, - "jest-resolve": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.5.tgz", - "integrity": "sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz", - "integrity": "sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-snapshot": "^27.4.5" - } - }, - "jest-runner": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.5.tgz", - "integrity": "sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.4", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.4.0", - "jest-environment-jsdom": "^27.4.4", - "jest-environment-node": "^27.4.4", - "jest-haste-map": "^27.4.5", - "jest-leak-detector": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.5", - "jest-runtime": "^27.4.5", - "jest-util": "^27.4.2", - "jest-worker": "^27.4.5", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - } - }, - "jest-runtime": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.5.tgz", - "integrity": "sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ==", - "dev": true, - "requires": { - "@jest/console": "^27.4.2", - "@jest/environment": "^27.4.4", - "@jest/globals": "^27.4.4", - "@jest/source-map": "^27.4.0", - "@jest/test-result": "^27.4.2", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.4.5", - "jest-message-util": "^27.4.2", - "jest-mock": "^27.4.2", - "jest-regex-util": "^27.4.0", - "jest-resolve": "^27.4.5", - "jest-snapshot": "^27.4.5", - "jest-util": "^27.4.2", - "jest-validate": "^27.4.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.2.0" - } - }, - "jest-serializer": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz", - "integrity": "sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.5.tgz", - "integrity": "sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.4.5", - "@jest/types": "^27.4.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.4.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-haste-map": "^27.4.5", - "jest-matcher-utils": "^27.4.2", - "jest-message-util": "^27.4.2", - "jest-resolve": "^27.4.5", - "jest-util": "^27.4.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.4.2", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz", - "integrity": "sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.4", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.2.tgz", - "integrity": "sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.4.0", - "leven": "^3.1.0", - "pretty-format": "^27.4.2" - }, - "dependencies": { - "camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.2.tgz", - "integrity": "sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg==", - "dev": true, - "requires": { - "@jest/test-result": "^27.4.2", - "@jest/types": "^27.4.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.4.2", - "string-length": "^4.0.1" - } - }, - "jest-websocket-mock": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.2.1.tgz", - "integrity": "sha512-fhsGLXrPfs06PhHoxqOSA9yZ6Rb4qYrf4Wcm7/nfRzjlrf1gIeuhYUkzMRjjE0TMQ37SwkmeLanwrZY4ZaNp8g==", - "dev": true, - "requires": { - "jest-diff": "^27.0.2" - } - }, - "jest-worker": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", - "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - } - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mock-socket": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.0.8.tgz", - "integrity": "sha512-8Syqkaaa2SzRqW68DEsnZkKQicHP7hVzfj3uCvigB5TL79H1ljKbwmOcRIENkx0ZTyu/5W6u+Pk9Qy6JCp38Ww==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - }, - "pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "requires": { - "irregular-plurals": "^3.2.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-format": { - "version": "27.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.2.tgz", - "integrity": "sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==", - "dev": true, - "requires": { - "@jest/types": "^27.4.2", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-polyfill": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", - "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==", - "dev": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "reconnecting-websocket": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", - "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "ts-jest": { - "version": "27.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.2.tgz", - "integrity": "sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - } - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tsd": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.19.1.tgz", - "integrity": "sha512-pSwchclr+ADdxlahRUQXUrdAIOjXx1T1PQV+fLfVLuo/S4z+T00YU84fH8iPlZxyA2pWgJjo42BG1p9SDb4NOw==", - "dev": true, - "requires": { - "@tsd/typescript": "~4.5.2", - "eslint-formatter-pretty": "^4.1.0", - "globby": "^11.0.1", - "meow": "^9.0.0", - "path-exists": "^4.0.0", - "read-pkg-up": "^7.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", - "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "z-schema": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.2.tgz", - "integrity": "sha512-40TH47ukMHq5HrzkeVE40Ad7eIDKaRV2b+Qpi2prLc9X9eFJFzV7tMe5aH12e6avaSS/u5l653EQOv+J9PirPw==", - "dev": true, - "requires": { - "commander": "^2.7.1", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - } - } - } -} diff --git a/packages/calckey-js/package.json b/packages/calckey-js/package.json index 6f724fc219..fdb253f454 100644 --- a/packages/calckey-js/package.json +++ b/packages/calckey-js/package.json @@ -1,44 +1,50 @@ { "name": "calckey-js", - "version": "0.0.22", + "version": "0.0.24", "description": "Calckey SDK for JavaScript", "main": "./built/index.js", "types": "./built/index.d.ts", "scripts": { - "build": "tsc", - "tsd": "tsd", + "build": "pnpm swc src -d built -D", + "render": "pnpm run build && pnpm run api && pnpm run api-prod && cp temp/calckey-js.api.json etc/ && pnpm run api-doc", + "tsd": "tsc && tsd", "api": "pnpm api-extractor run --local --verbose", "api-prod": "pnpm api-extractor run --verbose", - "typecheck": "tsc --noEmit", - "lint": "pnpm typecheck && pnpm rome check \"src/*.ts\"", + "api-doc": "pnpm api-documenter markdown -i ./etc/", + "lint": "pnpm rome check --apply *.ts", + "format": "pnpm rome format --write *.ts", "jest": "jest --coverage --detectOpenHandles", "test": "pnpm jest && pnpm tsd" }, "repository": { "type": "git", - "url": "https://codeberg.org/calckey/calckey.js" + "url": "https://codeberg.org/calckey/calckey.git" }, "devDependencies": { - "@microsoft/api-extractor": "^7.19.3", + "@microsoft/api-extractor": "^7.36.0", + "@microsoft/api-documenter": "^7.22.21", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.62", "@types/jest": "^27.4.0", - "@types/node": "17.0.5", - "@typescript-eslint/eslint-plugin": "5.8.1", - "@typescript-eslint/parser": "5.8.1", - "eslint": "8.6.0", + "@types/node": "20.3.1", "jest": "^27.4.5", "jest-fetch-mock": "^3.0.3", "jest-websocket-mock": "^2.2.1", "mock-socket": "^9.0.8", "ts-jest": "^27.1.2", "ts-node": "10.4.0", - "tsd": "^0.19.1", - "typescript": "4.5.4" + "tsd": "^0.28.1", + "typescript": "5.1.3" }, - "files": ["built"], + "files": [ + "built" + ], "dependencies": { - "autobind-decorator": "^2.4.0", "eventemitter3": "^4.0.7", "reconnecting-websocket": "^4.4.0", "semver": "^7.3.8" + }, + "optionalDependencies": { + "@swc/core-android-arm64": "1.3.11" } } diff --git a/packages/calckey-js/src/streaming.ts b/packages/calckey-js/src/streaming.ts index 80a3d6e8c3..924e33a45c 100644 --- a/packages/calckey-js/src/streaming.ts +++ b/packages/calckey-js/src/streaming.ts @@ -1,8 +1,26 @@ -import autobind from "autobind-decorator"; import { EventEmitter } from "eventemitter3"; import ReconnectingWebsocket from "reconnecting-websocket"; import { BroadcastEvents, Channels } from "./streaming.types"; +function autobind(instance: any): void { + const prototype = Object.getPrototypeOf(instance); + + const propertyNames = Object.getOwnPropertyNames(prototype); + + for (const key of propertyNames) { + const descriptor = Object.getOwnPropertyDescriptor(prototype, key); + + if (typeof descriptor?.value === "function" && key !== "constructor") { + Object.defineProperty(instance, key, { + value: instance[key].bind(instance), + enumerable: descriptor.enumerable, + configurable: descriptor.configurable, + writable: descriptor.writable, + }); + } + } +} + export function urlQuery( obj: Record<string, string | number | boolean | undefined>, ): string { @@ -45,6 +63,7 @@ export default class Stream extends EventEmitter<StreamEvents> { }, ) { super(); + autobind(this); options = options || {}; const query = urlQuery({ @@ -71,12 +90,10 @@ export default class Stream extends EventEmitter<StreamEvents> { this.stream.addEventListener("message", this.onMessage); } - @autobind private genId(): string { return (++this.idCounter).toString(); } - @autobind public useChannel<C extends keyof Channels>( channel: C, params?: Channels[C]["params"], @@ -89,7 +106,6 @@ export default class Stream extends EventEmitter<StreamEvents> { } } - @autobind private useSharedConnection<C extends keyof Channels>( channel: C, name?: string, @@ -106,21 +122,18 @@ export default class Stream extends EventEmitter<StreamEvents> { return connection; } - @autobind public removeSharedConnection(connection: SharedConnection): void { this.sharedConnections = this.sharedConnections.filter( (c) => c !== connection, ); } - @autobind public removeSharedConnectionPool(pool: Pool): void { this.sharedConnectionPools = this.sharedConnectionPools.filter( (p) => p !== pool, ); } - @autobind private connectToChannel<C extends keyof Channels>( channel: C, params: Channels[C]["params"], @@ -135,7 +148,6 @@ export default class Stream extends EventEmitter<StreamEvents> { return connection; } - @autobind public disconnectToChannel(connection: NonSharedConnection): void { this.nonSharedConnections = this.nonSharedConnections.filter( (c) => c !== connection, @@ -145,7 +157,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Callback of when open connection */ - @autobind private onOpen(): void { const isReconnect = this.state === "reconnecting"; @@ -162,7 +173,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Callback of when close connection */ - @autobind private onClose(): void { if (this.state === "connected") { this.state = "reconnecting"; @@ -173,7 +183,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Callback of when received a message from connection */ - @autobind private onMessage(message: { data: string }): void { const { type, body } = JSON.parse(message.data); @@ -203,7 +212,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Send a message to connection */ - @autobind public send(typeOrPayload: any, payload?: any): void { const data = payload === undefined @@ -219,7 +227,6 @@ export default class Stream extends EventEmitter<StreamEvents> { /** * Close this connection */ - @autobind public close(): void { this.stream.close(); } @@ -243,12 +250,10 @@ class Pool { this.stream.on("_disconnected_", this.onStreamDisconnected); } - @autobind private onStreamDisconnected(): void { this.isConnected = false; } - @autobind public inc(): void { if (this.users === 0 && !this.isConnected) { this.connect(); @@ -263,7 +268,6 @@ class Pool { } } - @autobind public dec(): void { this.users--; @@ -277,7 +281,6 @@ class Pool { } } - @autobind public connect(): void { if (this.isConnected) return; this.isConnected = true; @@ -287,7 +290,6 @@ class Pool { }); } - @autobind private disconnect(): void { this.stream.off("_disconnected_", this.onStreamDisconnected); this.stream.send("disconnect", { id: this.id }); @@ -314,7 +316,6 @@ export abstract class Connection< this.name = name; } - @autobind public send<T extends keyof Channel["receives"]>( type: T, body: Channel["receives"][T], @@ -347,7 +348,6 @@ class SharedConnection< this.pool.inc(); } - @autobind public dispose(): void { this.pool.dec(); this.removeAllListeners(); @@ -375,7 +375,6 @@ class NonSharedConnection< this.connect(); } - @autobind public connect(): void { this.stream.send("connect", { channel: this.channel, @@ -384,7 +383,6 @@ class NonSharedConnection< }); } - @autobind public dispose(): void { this.removeAllListeners(); this.stream.send("disconnect", { id: this.id }); diff --git a/packages/calckey-js/src/streaming.types.ts b/packages/calckey-js/src/streaming.types.ts index 7f1edc87d6..c0b0b030cd 100644 --- a/packages/calckey-js/src/streaming.types.ts +++ b/packages/calckey-js/src/streaming.types.ts @@ -90,6 +90,15 @@ export type Channels = { }; receives: null; }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; messaging: { params: { otherparty?: User["id"] | null; diff --git a/packages/calckey-js/test-d/api.ts b/packages/calckey-js/test-d/api.ts index c5018177c9..82dbae245c 100644 --- a/packages/calckey-js/test-d/api.ts +++ b/packages/calckey-js/test-d/api.ts @@ -4,7 +4,7 @@ import * as Misskey from "../src"; describe("API", () => { test("success", async () => { const cli = new Misskey.api.APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); const res = await cli.request("meta", { detail: true }); @@ -13,7 +13,7 @@ describe("API", () => { test("conditional respose type (meta)", async () => { const cli = new Misskey.api.APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -35,7 +35,7 @@ describe("API", () => { test("conditional respose type (users/show)", async () => { const cli = new Misskey.api.APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); diff --git a/packages/calckey-js/test-d/streaming.ts b/packages/calckey-js/test-d/streaming.ts index c49795dcc2..f9c414da70 100644 --- a/packages/calckey-js/test-d/streaming.ts +++ b/packages/calckey-js/test-d/streaming.ts @@ -3,7 +3,7 @@ import * as Misskey from "../src"; describe("Streaming", () => { test("emit type", async () => { - const stream = new Misskey.Stream("https://misskey.test", { + const stream = new Misskey.Stream("https://calckey.test", { token: "TOKEN", }); const mainChannel = stream.useChannel("main"); @@ -13,7 +13,7 @@ describe("Streaming", () => { }); test("params type", async () => { - const stream = new Misskey.Stream("https://misskey.test", { + const stream = new Misskey.Stream("https://calckey.test", { token: "TOKEN", }); // TODO: 「stream.useChannel の第二引数として受け入れる型が diff --git a/packages/calckey-js/test/api.ts b/packages/calckey-js/test/api.ts index a8a1fc0e6f..5de41e1ed1 100644 --- a/packages/calckey-js/test/api.ts +++ b/packages/calckey-js/test/api.ts @@ -5,7 +5,7 @@ enableFetchMocks(); function getFetchCall(call: any[]) { const { body, method } = call[1]; - if (body != null && typeof body != "string") { + if (body != null && typeof body !== "string") { throw new Error("invalid body"); } return { @@ -20,7 +20,7 @@ describe("API", () => { fetchMock.resetMocks(); fetchMock.mockResponse(async (req) => { const body = await req.json(); - if (req.method == "POST" && req.url == "https://misskey.test/api/i") { + if (req.method === "POST" && req.url === "https://calckey.test/api/i") { if (body.i === "TOKEN") { return JSON.stringify({ id: "foo" }); } else { @@ -32,7 +32,7 @@ describe("API", () => { }); const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -43,7 +43,7 @@ describe("API", () => { }); expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ - url: "https://misskey.test/api/i", + url: "https://calckey.test/api/i", method: "POST", body: { i: "TOKEN" }, }); @@ -54,8 +54,8 @@ describe("API", () => { fetchMock.mockResponse(async (req) => { const body = await req.json(); if ( - req.method == "POST" && - req.url == "https://misskey.test/api/notes/show" + req.method === "POST" && + req.url === "https://calckey.test/api/notes/show" ) { if (body.i === "TOKEN" && body.noteId === "aaaaa") { return JSON.stringify({ id: "foo" }); @@ -68,7 +68,7 @@ describe("API", () => { }); const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -79,7 +79,7 @@ describe("API", () => { }); expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ - url: "https://misskey.test/api/notes/show", + url: "https://calckey.test/api/notes/show", method: "POST", body: { i: "TOKEN", noteId: "aaaaa" }, }); @@ -89,8 +89,8 @@ describe("API", () => { fetchMock.resetMocks(); fetchMock.mockResponse(async (req) => { if ( - req.method == "POST" && - req.url == "https://misskey.test/api/reset-password" + req.method === "POST" && + req.url === "https://calckey.test/api/reset-password" ) { return { status: 204 }; } else { @@ -99,7 +99,7 @@ describe("API", () => { }); const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -111,7 +111,7 @@ describe("API", () => { expect(res).toEqual(null); expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ - url: "https://misskey.test/api/reset-password", + url: "https://calckey.test/api/reset-password", method: "POST", body: { i: "TOKEN", token: "aaa", password: "aaa" }, }); @@ -121,7 +121,7 @@ describe("API", () => { fetchMock.resetMocks(); fetchMock.mockResponse(async (req) => { const body = await req.json(); - if (req.method == "POST" && req.url == "https://misskey.test/api/i") { + if (req.method === "POST" && req.url === "https://calckey.test/api/i") { if (typeof body.i === "string") { return JSON.stringify({ id: "foo" }); } else { @@ -143,7 +143,7 @@ describe("API", () => { try { const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -172,7 +172,7 @@ describe("API", () => { try { const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -189,7 +189,7 @@ describe("API", () => { try { const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); @@ -210,7 +210,7 @@ describe("API", () => { try { const cli = new APIClient({ - origin: "https://misskey.test", + origin: "https://calckey.test", credential: "TOKEN", }); diff --git a/packages/calckey-js/test/streaming.ts b/packages/calckey-js/test/streaming.ts index 920a9102b8..1a3a71374a 100644 --- a/packages/calckey-js/test/streaming.ts +++ b/packages/calckey-js/test/streaming.ts @@ -3,8 +3,8 @@ import Stream from "../src/streaming"; describe("Streaming", () => { test("useChannel", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); const mainChannelReceived: any[] = []; const main = stream.useChannel("main"); main.on("meUpdated", (payload) => { @@ -44,8 +44,8 @@ describe("Streaming", () => { }); test("useChannel with parameters", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); const messagingChannelReceived: any[] = []; const messaging = stream.useChannel("messaging", { otherparty: "aaa" }); messaging.on("message", (payload) => { @@ -86,8 +86,8 @@ describe("Streaming", () => { }); test("ちゃんとチャンネルごとにidが異なる", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); stream.useChannel("messaging", { otherparty: "aaa" }); stream.useChannel("messaging", { otherparty: "bbb" }); @@ -111,8 +111,8 @@ describe("Streaming", () => { }); test("Connection#send", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); const messaging = stream.useChannel("messaging", { otherparty: "aaa" }); messaging.send("read", { id: "aaa" }); @@ -136,8 +136,8 @@ describe("Streaming", () => { }); test("Connection#dispose", async () => { - const server = new WS("wss://misskey.test/streaming"); - const stream = new Stream("https://misskey.test", { token: "TOKEN" }); + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); const mainChannelReceived: any[] = []; const main = stream.useChannel("main"); main.on("meUpdated", (payload) => { diff --git a/packages/client/assets/label-red.svg b/packages/client/assets/label-red.svg index 4b95a931a3..bf1e9cedbc 100644 --- a/packages/client/assets/label-red.svg +++ b/packages/client/assets/label-red.svg @@ -1 +1 @@ -<svg width="96" height="96" xmlns="http://www.w3.org/2000/svg"><path fill="#eb6f92" d="M0 45.255L45.254 0h39.6L0 84.854z"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96"><path fill="#eb6f92" d="M0 45.255 45.254 0h39.6L0 84.854z"/></svg> \ No newline at end of file diff --git a/packages/client/assets/label.svg b/packages/client/assets/label.svg index e076c6baf8..976bf410f9 100644 --- a/packages/client/assets/label.svg +++ b/packages/client/assets/label.svg @@ -1 +1 @@ -<svg width="96" height="96" xmlns="http://www.w3.org/2000/svg"><path fill="#31748f" d="M0 45.255L45.254 0h39.6L0 84.854z"/></svg> +<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96"><path fill="#31748f" d="M0 45.255 45.254 0h39.6L0 84.854z"/></svg> \ No newline at end of file diff --git a/packages/client/assets/misskey.svg b/packages/client/assets/misskey.svg index e68af591a6..13ee2ced63 100644 --- a/packages/client/assets/misskey.svg +++ b/packages/client/assets/misskey.svg @@ -1,16 +1 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" version="1.1" - viewBox="0 0 521 136" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> - - <g> - <g transform="matrix(.26953 0 0 .26953 -55.341 -52.023)"> - - </g> - <g transform="matrix(3.6954 0 0 3.6954 208.34 -284.25)" clip-rule="evenodd" fill-rule="evenodd" - stroke-linejoin="round" stroke-miterlimit="2"> - <path - d="m11.582 84.119c-2.9058 0-5.3921 1.02-7.46 3.0598-2.0402 2.0676-3.0598 4.5542-3.0598 7.46 3.7964 0.03742 4.5686 0.01036 6.5746 8.19e-4 0.0018-4.15e-4 0.0033-4.15e-4 0.0052-8.19e-4 0.02839-2.1351 1.6603-3.7068 3.94-3.94 1.0619 0 1.9701 0.39127 2.7243 1.174 0.64225 0.6421 1.425 0.96317 2.348 0.96317 0.92083 0 1.7034-0.32106 2.3464-0.96317 0.64225-0.64276 0.96396-1.4254 0.96396-2.348 0-0.92126-0.32172-1.7032-0.96396-2.346-2.0679-2.0399-4.5406-3.0598-7.4187-3.0598zm-3.9452 10.521c-2.5881-4.2016-2.6041 0.06416-6.5746-8.19e-4 0 2.9058 1.0204 5.2887 3.0606 7.3564 2.0679 2.0399 4.5538 3.0598 7.4596 3.0598 2.8781 0 5.3512-1.02 7.4191-3.0598 0.64225-0.64284 0.96357-1.4247 0.96357-2.346 0-0.92258-0.32132-1.7052-0.96357-2.348-0.64298-0.6421-1.4256-0.96317-2.3464-0.96317-0.92301 0-1.7057 0.32106-2.348 0.96317-0.75426 0.7827-1.6628 1.1736-2.7247 1.1736-2.2797-0.23324-3.9124-1.7001-3.9408-3.8352-0.0018 1.1e-5 -0.0029-1e-5 -0.0048 0zm-49.468-17.45c-3.8683 0-7.1782 1.3578-9.9311 4.0734-2.716 2.7525-4.0734 6.0628-4.0734 9.9311 5.0539 0.04979 6.082 0.01348 8.7525 0.0011 0.0024-4.51e-4 0.0044-6.05e-4 0.0069-0.0011 0.03779-2.8423 2.2103-4.9346 5.2451-5.2451 1.4137 0 2.6227 0.52089 3.6268 1.5629 0.855 0.8548 1.897 1.2822 3.1257 1.2822 1.2258 0 2.2676-0.42741 3.1236-1.2822 0.85499-0.85567 1.2833-1.8976 1.2833-3.1257 0-1.2264-0.42828-2.2673-1.2833-3.1231-2.7528-2.7156-6.0446-4.0734-9.8761-4.0734zm-5.252 14.006c-3.4453-5.5934-3.4667 0.08539-8.7525-0.0011 0 3.8683 1.3584 7.0406 4.0744 9.7931 2.7528 2.7156 6.0623 4.0734 9.9305 4.0734 3.8315 0 7.1238-1.3578 9.8766-4.0734 0.85499-0.85577 1.2827-1.8967 1.2827-3.1231 0-1.2282-0.42775-2.2701-1.2827-3.1257-0.85596-0.8548-1.8978-1.2822-3.1236-1.2822-1.2287 0-2.2707 0.42741-3.1257 1.2822-1.0041 1.042-2.2136 1.5623-3.6273 1.5623-3.0348-0.31051-5.2084-2.2633-5.2462-5.1056-0.0024 1.1e-5 -0.0039-1.2e-5 -0.0063 0zm42.663-14.006c-1.1773 0-2.1864 0.42062-3.0269 1.2611-0.84045 0.84111-1.2714 1.8501-1.2605 3.0274l0.17494 19.047c0.010814 1.1772 0.42009 2.1864 1.2605 3.0269 0.84111 0.81273 1.8503 1.2188 3.0269 1.2188 1.178 0 2.1735-0.40606 2.9862-1.2188 0.84045-0.84045 1.2708-1.8497 1.26-3.0269l-0.17494-19.047c-0.010822-1.178-0.41956-2.187-1.26-3.0274-0.81332-0.84045-1.8089-1.2611-2.9862-1.2611zm29.767 0c-1.1765 0-2.1851 0.42062-3.0253 1.2611-0.81252 0.81266-1.2278 1.807-1.2198 2.9836l0.13108 19.314c8e-3 1.1772 0.4068 2.1864 1.2193 3.0269 0.84023 0.81266 1.8488 1.2193 3.0253 1.2193 1.1779 0 2.1859-0.40666 3.0269-1.2193 0.84023-0.84045 1.2611-1.8491 1.2611-3.0258 0-0.84046 0.1119-1.26 0.33509-1.26 0.11305 0 0.22508 0.04136 0.33667 0.12473l4.2029 4.0771c0.84023 0.81267 1.8348 1.2188 2.9836 1.2188 1.2042 0 2.2131-0.42062 3.0264-1.2611 0.81252-0.86897 1.2188-1.8637 1.2188-2.9841 0-1.2051-0.43415-2.2277-1.3028-3.0681-1.9058-1.8775-2.8997-2.8439-2.9836-2.8995-0.36468-0.36468-0.35117-0.67278 0.04123-0.92493l0.08456-0.04175v-0.04175l2.6479-1.6813c1.2603-0.84045 1.8911-2.0312 1.8911-3.5718 0-0.84045-0.22446-1.6253-0.67229-2.3546-0.84023-1.2606-2.0312-1.8911-3.5723-1.8911-0.84023 0-1.6251 0.22424-2.353 0.67229-3.2501 2.1581-4.932 3.265-5.0443 3.3213-0.19547 0.1396-0.37822 0.167-0.54597 0.08298-0.19693-0.08402-0.28963-0.2661-0.29545-0.54597l-0.13055-6.2858c-0.02446-1.1764-0.41978-2.1709-1.26-2.9836-0.84023-0.84045-1.8492-1.2611-3.0264-1.2611zm-46.276 6.9095c-2.8795 0-5.3538 1.0204-7.4227 3.0612-0.64257 0.64316-0.96404 1.4255-0.96404 2.3472 0 0.92303 0.32146 1.7062 0.96404 2.3493 0.64331 0.64243 1.4265 0.96351 2.3477 0.96351 0.92347 0 1.7068-0.32108 2.3493-0.96351 0.75465-0.78308 1.6632-1.1744 2.7256-1.1744 1.0894 0 2.0261 0.37695 2.8091 1.1316 0.75536 0.78309 1.1332 1.7201 1.1332 2.8102 0 1.0617-0.39242 1.9703-1.1754 2.7256-0.39149 0.4193-0.86676 0.69884-1.4249 0.83878-0.14116 0.02773-0.25248 0.01369-0.33614-0.04175-0.05605-0.08456-0.02751-0.16827 0.08456-0.25211l0.83825-0.88053c0.64329-0.64315 0.9651-1.412 0.9651-2.306 0-0.92236-0.27937-1.6632-0.83825-2.2225-0.55888-0.55932-1.3422-0.83878-2.3493-0.83878-0.6986 0-1.397 0.34902-2.0956 1.0475l-4.8651 4.8223c-0.64328 0.6438-0.96457 1.4271-0.96457 2.3488 0 0.92302 0.32128 1.7053 0.96457 2.3477 1.9568 1.9293 4.3751 2.8942 7.2546 2.8942 2.9072 0 5.3945-1.0343 7.4634-3.103 2.0412-2.0409 3.0618-4.501 3.0618-7.3804 0-2.9072-1.0206-5.3952-3.0618-7.4639-2.0689-2.0409-4.5562-3.0612-7.4634-3.0612zm74.764 0.02061c-2.9138 0-5.4067 1.0365-7.4803 3.1099-2.0459 2.0456-3.0686 4.5113-3.0686 7.3973 0 2.9138 1.0228 5.4074 3.0686 7.4808 2.0736 2.0455 4.5665 3.0681 7.4803 3.0681 2.8861 0 5.366-1.0226 7.4396-3.0681 0.64403-0.64462 0.96668-1.4287 0.96668-2.3525 0-0.92513-0.32265-1.7101-0.96668-2.3546-0.64476-0.64388-1.4296-0.96562-2.353-0.96562-0.92557 0-1.71 0.32174-2.3541 0.96562-0.75635 0.78488-1.6676 1.177-2.7325 1.177-1.0919 0-2.0307-0.37787-2.8155-1.1342-0.75708-0.78487-1.1353-1.7239-1.1353-2.8165 0-1.0641 0.39276-1.9749 1.1776-2.732 0.3924-0.42026 0.86866-0.7001 1.4281-0.84036 0.1415-0.02779 0.25332-0.01436 0.3372 0.04122 0.05616 0.08475 0.02777 0.16914-0.08456 0.25317l-0.84036 0.88264c-0.64476 0.64462-0.96721 1.4152-0.96721 2.3113 0 0.92447 0.28021 1.6667 0.84036 2.2272 0.56015 0.56059 1.3452 0.84036 2.3546 0.84036 0.70019 0 1.4002-0.34954 2.1004-1.0497l4.8757-4.8334c0.64476-0.64527 0.96721-1.4303 0.96721-2.3541 0-0.92513-0.32245-1.7091-0.96721-2.353-1.9613-1.9337-4.3849-2.9006-7.271-2.9006zm14.135 0.36468c-1.1765 0-2.1851 0.42009-3.0253 1.2605-0.81252 0.812-1.2188 1.8068-1.2188 2.9841v5.8418c0 2.8297 1.0081 5.2528 3.0248 7.2699 2.0182 2.0171 4.4428 3.0258 7.272 3.0258 0.56088 0 1.0792-0.0419 1.5555-0.12526 0.28008-0.0563 0.4756-5e-5 0.5872 0.16807 0.08461 0.11181 0.05633 0.26591-0.08298 0.46247-0.36468 0.50429-1.1358 0.75632-2.3123 0.75632-0.44783 0-1.0216-0.11178-1.7225-0.33614-0.70019-0.22435-1.2466-0.33668-1.639-0.33668-1.6535 0-2.8163 0.75713-3.4888 2.2706-0.25163 0.50428-0.37843 1.0362-0.37843 1.5967 0 1.6531 0.74329 2.816 2.2283 3.4883 1.485 0.70012 3.1515 1.0502 5.0004 1.0502 3.1946 0 5.7299-0.93854 7.6066-2.816 3.8023-4.6583 2.8593-9.356 2.8593-15.214 7.29e-4 -2.3268 0.04625-4.7173 0.08298-7.1024 0.01812-1.1765-0.41958-2.1714-1.2605-2.9841-0.81252-0.84045-1.8064-1.2605-2.9836-1.2605s-2.1859 0.42009-3.0269 1.2605c-0.84023 0.812-1.2605 1.8068-1.2605 2.9841v5.8418c0 0.47577-0.16851 0.89593-0.50475 1.2605-0.33551 0.33624-0.75529 0.50422-1.26 0.50422-0.47628 0-0.89659-0.16798-1.2605-0.50422-0.33624-0.36461-0.50475-0.78478-0.50475-1.2605v-5.8418c0-1.1766-0.42031-2.1714-1.2605-2.9841-0.84096-0.84045-1.8504-1.2605-3.0269-1.2605z" - clip-rule="evenodd" fill="#fff" fill-rule="nonzero" stroke-miterlimit="2" stroke-width="0" /> - </g> - </g> -</svg> +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" clip-rule="evenodd" viewBox="0 0 521 136"><path fill="#fff" fill-rule="nonzero" d="M251.14 26.603c-10.738 0-19.926 3.77-27.568 11.308-7.539 7.64-11.307 16.83-11.307 27.567 14.03.139 16.883.039 24.296.003l.02-.003c.104-7.89 6.135-13.698 14.56-14.56 3.923 0 7.28 1.446 10.067 4.339 2.373 2.373 5.265 3.559 8.676 3.559 3.403 0 6.295-1.186 8.671-3.56 2.374-2.375 3.562-5.267 3.562-8.676 0-3.404-1.188-6.294-3.562-8.67-7.642-7.538-16.78-11.307-27.415-11.307zm-14.579 38.88c-9.564-15.527-9.623.237-24.296-.003 0 10.738 3.771 19.543 11.31 27.184 7.642 7.539 16.829 11.308 27.567 11.308 10.635 0 19.774-3.77 27.416-11.308 2.374-2.375 3.56-5.264 3.56-8.669 0-3.41-1.186-6.301-3.56-8.677-2.376-2.373-5.268-3.559-8.67-3.559-3.412 0-6.304 1.186-8.678 3.56-2.787 2.892-6.144 4.336-10.068 4.336-8.425-.862-14.458-6.282-14.563-14.172h-.018zM53.757.998c-14.295 0-26.526 5.018-36.7 15.053C7.022 26.222 2.006 38.455 2.006 52.75c18.676.183 22.475.049 32.344.003l.025-.004c.14-10.503 8.168-18.235 19.383-19.383 5.224 0 9.692 1.925 13.402 5.776 3.16 3.159 7.01 4.738 11.551 4.738 4.53 0 8.38-1.58 11.543-4.738 3.16-3.162 4.742-7.012 4.742-11.55 0-4.533-1.582-8.38-4.742-11.542C80.08 6.016 67.916.998 53.757.998zM34.349 52.756c-12.732-20.67-12.811.315-32.344-.004 0 14.295 5.02 26.017 15.056 36.19 10.173 10.034 22.403 15.052 36.697 15.052 14.16 0 26.326-5.018 36.498-15.053 3.16-3.162 4.74-7.009 4.74-11.541 0-4.539-1.58-8.389-4.74-11.55-3.163-3.16-7.013-4.739-11.543-4.739-4.54 0-8.39 1.58-11.55 4.738-3.71 3.85-8.18 5.774-13.405 5.774-11.214-1.148-19.247-8.364-19.386-18.868h-.024zM192.006.998c-4.351 0-8.08 1.554-11.186 4.66-3.106 3.108-4.698 6.837-4.658 11.188l.646 70.386c.04 4.35 1.553 8.08 4.658 11.186 3.109 3.003 6.838 4.503 11.186 4.503 4.353 0 8.032-1.5 11.035-4.503 3.106-3.106 4.696-6.836 4.656-11.186l-.646-70.386c-.04-4.354-1.55-8.082-4.656-11.188-3.006-3.106-6.685-4.66-11.035-4.66zm110 0c-4.347 0-8.074 1.554-11.18 4.66-3.002 3.003-4.536 6.678-4.507 11.026l.485 71.373c.03 4.35 1.503 8.08 4.505 11.185 3.105 3.003 6.832 4.506 11.18 4.506 4.353 0 8.078-1.503 11.186-4.506 3.105-3.105 4.66-6.833 4.66-11.181 0-3.106.414-4.656 1.238-4.656.418 0 .832.152 1.244.46l15.532 15.067c3.105 3.003 6.78 4.504 11.025 4.504 4.45 0 8.179-1.554 11.184-4.66 3.003-3.211 4.504-6.887 4.504-11.028 0-4.453-1.604-8.232-4.814-11.338-7.043-6.938-10.716-10.509-11.026-10.714-1.347-1.348-1.298-2.487.153-3.418l.312-.155v-.154l9.785-6.213c4.657-3.106 6.988-7.506 6.988-13.2 0-3.105-.83-6.005-2.484-8.7-3.105-4.659-7.506-6.989-13.201-6.989-3.105 0-6.005.829-8.695 2.485-12.01 7.975-18.226 12.065-18.641 12.273-.722.516-1.398.617-2.018.307-.727-.31-1.07-.984-1.091-2.018l-.483-23.228c-.09-4.348-1.551-8.023-4.656-11.026C310.086 2.554 306.357 1 302.007 1zM130.999 26.53c-10.64 0-19.784 3.771-27.43 11.313-2.374 2.376-3.562 5.267-3.562 8.673 0 3.411 1.188 6.306 3.562 8.682 2.378 2.374 5.272 3.56 8.676 3.56 3.413 0 6.307-1.186 8.682-3.56 2.788-2.894 6.146-4.34 10.072-4.34 4.026 0 7.487 1.393 10.38 4.182 2.792 2.894 4.188 6.356 4.188 10.385 0 3.923-1.45 7.28-4.343 10.072a10.578 10.578 0 0 1-5.266 3.1c-.522.102-.933.05-1.242-.155-.207-.312-.102-.622.312-.931l3.098-3.254c2.377-2.377 3.567-5.218 3.567-8.522 0-3.408-1.033-6.146-3.098-8.213-2.065-2.067-4.96-3.1-8.682-3.1-2.581 0-5.162 1.29-7.744 3.871l-17.978 17.82c-2.378 2.38-3.565 5.274-3.565 8.68 0 3.411 1.187 6.302 3.565 8.676 7.23 7.13 16.167 10.695 26.808 10.695 10.744 0 19.935-3.822 27.58-11.466 7.544-7.542 11.315-16.633 11.315-27.274 0-10.743-3.771-19.937-11.314-27.582-7.646-7.542-16.837-11.312-27.58-11.312zm276.283.076c-10.768 0-19.98 3.83-27.643 11.493-7.56 7.56-11.34 16.67-11.34 27.336 0 10.767 3.78 19.982 11.34 27.644 7.663 7.56 16.875 11.338 27.643 11.338 10.665 0 19.83-3.779 27.492-11.338 2.38-2.382 3.573-5.28 3.573-8.693 0-3.419-1.193-6.32-3.573-8.701-2.382-2.38-5.283-3.569-8.695-3.569-3.42 0-6.319 1.19-8.7 3.569-2.794 2.9-6.162 4.35-10.097 4.35-4.035 0-7.504-1.397-10.404-4.192-2.798-2.9-4.196-6.37-4.196-10.408 0-3.933 1.452-7.298 4.352-10.096a10.6 10.6 0 0 1 5.277-3.106c.523-.102.937-.053 1.247.153.207.313.102.625-.313.935l-3.105 3.262c-2.383 2.382-3.575 5.23-3.575 8.541 0 3.417 1.036 6.16 3.106 8.23 2.07 2.072 4.97 3.106 8.701 3.106 2.587 0 5.174-1.292 7.762-3.879l18.017-17.861c2.383-2.385 3.575-5.286 3.575-8.7 0-3.418-1.192-6.315-3.575-8.695-7.247-7.146-16.203-10.719-26.869-10.719zm52.235 1.348c-4.348 0-8.075 1.552-11.18 4.658-3.003 3-4.504 6.677-4.504 11.028v21.587c0 10.457 3.725 19.412 11.178 26.866 7.458 7.454 16.418 11.181 26.873 11.181 2.072 0 3.988-.155 5.748-.463 1.035-.208 1.757 0 2.17.621.313.413.208.983-.307 1.71-1.347 1.863-4.197 2.794-8.545 2.794-1.655 0-3.775-.413-6.365-1.242-2.587-.829-4.607-1.244-6.057-1.244-6.11 0-10.407 2.798-12.892 8.39a13.044 13.044 0 0 0-1.399 5.901c0 6.109 2.747 10.406 8.235 12.89 5.487 2.588 11.646 3.882 18.478 3.882 11.806 0 21.175-3.469 28.11-10.407 14.05-17.214 10.566-34.574 10.566-56.221.003-8.599.17-17.433.307-26.247.067-4.347-1.55-8.024-4.658-11.027-3.003-3.106-6.676-4.658-11.026-4.658s-8.078 1.552-11.186 4.658c-3.105 3-4.658 6.677-4.658 11.027v21.588c0 1.758-.622 3.311-1.865 4.658-1.24 1.243-2.791 1.864-4.656 1.864-1.76 0-3.313-.621-4.658-1.864-1.243-1.347-1.865-2.9-1.865-4.658V43.64c0-4.348-1.554-8.024-4.659-11.027-3.107-3.106-6.838-4.658-11.185-4.658z"/></svg> \ No newline at end of file diff --git a/packages/client/package.json b/packages/client/package.json index 2a1dadeb40..2ec569381d 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -5,7 +5,7 @@ "watch": "pnpm vite build --watch --mode development", "build": "pnpm vite build", "lint": "pnpm rome check \"src/**/*.{ts,vue}\"", - "format": "pnpm prettier --write '**/*.vue'" + "format": "pnpm rome format * --write && pnpm prettier --write '**/*.{scss,vue}'" }, "devDependencies": { "@discordapp/twemoji": "14.1.2", @@ -44,6 +44,7 @@ "cross-env": "7.0.3", "cypress": "10.11.0", "date-fns": "2.30.0", + "emojilib": "github:thatonecalculator/emojilib", "escape-regexp": "0.0.1", "eventemitter3": "4.0.7", "focus-trap": "^7.4.3", @@ -79,6 +80,7 @@ "tsconfig-paths": "4.2.0", "twemoji-parser": "14.0.0", "typescript": "5.1.3", + "unicode-emoji-json": "^0.4.0", "uuid": "9.0.0", "vanilla-tilt": "1.8.0", "vite": "4.3.9", diff --git a/packages/client/src/components/MkAutocomplete.vue b/packages/client/src/components/MkAutocomplete.vue index 0455bd9d54..37207a14f7 100644 --- a/packages/client/src/components/MkAutocomplete.vue +++ b/packages/client/src/components/MkAutocomplete.vue @@ -99,7 +99,7 @@ import { acct } from "@/filters/user"; import * as os from "@/os"; import { MFM_TAGS } from "@/scripts/mfm-tags"; import { defaultStore } from "@/store"; -import { emojilist } from "@/scripts/emojilist"; +import { emojilist, addSkinTone } from "@/scripts/emojilist"; import { instance } from "@/instance"; import { i18n } from "@/i18n"; @@ -113,20 +113,26 @@ type EmojiDef = { const lib = emojilist.filter((x) => x.category !== "flags"); +for (const emoji of lib) { + if (emoji.skin_tone_support) { + emoji.emoji = addSkinTone(emoji.emoji); + } +} + const emjdb: EmojiDef[] = lib.map((x) => ({ - emoji: x.char, - name: x.name, - url: char2filePath(x.char), + emoji: x.emoji, + name: x.slug, + url: char2filePath(x.emoji), })); for (const x of lib) { if (x.keywords) { for (const k of x.keywords) { emjdb.push({ - emoji: x.char, + emoji: x.emoji, name: k, - aliasOf: x.name, - url: char2filePath(x.char), + aliasOf: x.slug, + url: char2filePath(x.emoji), }); } } diff --git a/packages/client/src/components/MkChatPreview.vue b/packages/client/src/components/MkChatPreview.vue index 135db0b262..c2f9d9db5b 100644 --- a/packages/client/src/components/MkChatPreview.vue +++ b/packages/client/src/components/MkChatPreview.vue @@ -102,7 +102,7 @@ function isMe(message): boolean { opacity: 0.8; } - &:not(.isRead) { + &:not(.isMe):not(.isRead) { background-color: var(--accentedBg); } diff --git a/packages/client/src/components/MkContainer.vue b/packages/client/src/components/MkContainer.vue index 62c198cb16..4c4e91160c 100644 --- a/packages/client/src/components/MkContainer.vue +++ b/packages/client/src/components/MkContainer.vue @@ -196,6 +196,7 @@ export default defineComponent({ &.scrollable { display: flex; flex-direction: column; + flex-grow: 1; > .content { overflow: auto; diff --git a/packages/client/src/components/MkEmojiPicker.section.vue b/packages/client/src/components/MkEmojiPicker.section.vue index 12e869e04c..1a9bccb149 100644 --- a/packages/client/src/components/MkEmojiPicker.section.vue +++ b/packages/client/src/components/MkEmojiPicker.section.vue @@ -1,20 +1,42 @@ <template> - <!-- このコンポーネントの要素のclassは親から利用されるのでむやみに弄らないこと --> <section> <header class="_acrylic" @click="shown = !shown"> <i class="toggle ph-fw ph-lg" :class=" shown - ? 'ph-caret-down-bold ph-lg' + ? 'ph-caret-down ph-bold ph-lg' : 'ph-caret-up ph-bold ph-lg' " ></i> <slot></slot> ({{ emojis.length }}) + <span v-if="props.skinToneSelector && props.skinTones"> + <button + v-for="skinTone in props.skinTones" + class="_button" + @click.stop=" + applyUnicodeSkinTone( + props.skinTones.indexOf(skinTone) + 1 + ) + " + > + <i + class="ph-circle ph-fill ph-fw ph-lg" + :style="{ color: skinTone + ' !important' }" + :aria-label=" + props.skinToneLabels + ? props.skinToneLabels[ + props.skinTones.indexOf(skinTone) + ] + : '' + " + ></i> + </button> + </span> </header> <div v-if="shown" class="body"> <button - v-for="emoji in emojis" + v-for="emoji in localEmojis" :key="emoji" class="_button item" @click="emit('chosen', emoji, $event)" @@ -26,18 +48,43 @@ </template> <script lang="ts" setup> -import { ref } from "vue"; +import { ref, watch, onMounted } from "vue"; +import { addSkinTone } from "@/scripts/emojilist"; const props = defineProps<{ emojis: string[]; initialShown?: boolean; + skinToneSelector?: boolean; + skinTones?: string[]; + skinToneLabels?: string[]; }>(); +const localEmojis = ref([...props.emojis]); + +function applyUnicodeSkinTone(custom?: number) { + for (let i = 0; i < localEmojis.value.length; i++) { + localEmojis.value[i] = addSkinTone(localEmojis.value[i], custom); + } +} + const emit = defineEmits<{ (ev: "chosen", v: string, event: MouseEvent): void; }>(); const shown = ref(!!props.initialShown); + +onMounted(() => { + if (props.skinToneSelector) { + applyUnicodeSkinTone(); + } +}); + +watch( + () => props.emojis, + (newVal) => { + localEmojis.value = [...newVal]; + } +); </script> <style lang="scss" scoped></style> diff --git a/packages/client/src/components/MkEmojiPicker.vue b/packages/client/src/components/MkEmojiPicker.vue index 3dd54ed840..88eaf3eedd 100644 --- a/packages/client/src/components/MkEmojiPicker.vue +++ b/packages/client/src/components/MkEmojiPicker.vue @@ -42,13 +42,13 @@ <div v-if="searchResultUnicode.length > 0" class="body"> <button v-for="emoji in searchResultUnicode" - :key="emoji.name" + :key="emoji.slug" class="_button item" - :title="emoji.name" + :title="emoji.slug" tabindex="0" @click="chosen(emoji, $event)" > - <MkEmoji class="emoji" :emoji="emoji.char" /> + <MkEmoji class="emoji" :emoji="emoji.emoji" /> </button> </div> </section> @@ -111,15 +111,20 @@ <div v-once class="group"> <header>{{ i18n.ts.emoji }}</header> <XSection - v-for="category in categories" + v-for="category in unicodeEmojiCategories" :key="category" + :skin-tone-selector="category === 'people'" + :skin-tones="unicodeEmojiSkinTones" + :skin-tone-labels="unicodeEmojiSkinToneLabels" :emojis=" emojilist .filter((e) => e.category === category) - .map((e) => e.char) + .map((e) => e.emoji) " @chosen="chosen" - >{{ category }}</XSection + >{{ + getNicelyLabeledCategory(category) || category + }}</XSection > </div> </div> @@ -163,8 +168,9 @@ import * as Misskey from "calckey-js"; import XSection from "@/components/MkEmojiPicker.section.vue"; import { emojilist, + unicodeEmojiCategories, UnicodeEmojiDef, - unicodeEmojiCategories as categories, + getNicelyLabeledCategory, } from "@/scripts/emojilist"; import { getStaticImageUrl } from "@/scripts/get-static-image-url"; import Ripple from "@/components/MkRipple.vue"; @@ -204,6 +210,24 @@ const { recentlyUsedEmojis, } = defaultStore.reactiveState; +const unicodeEmojiSkinTones = [ + "#FFDC5E", + "#F7DFCF", + "#F3D3A3", + "#D6AE89", + "#B17F56", + "#7D523C", +]; + +const unicodeEmojiSkinToneLabels = [ + i18n.ts._skinTones.yellow, + i18n.ts._skinTones.light, + i18n.ts._skinTones.mediumLight, + i18n.ts._skinTones.medium, + i18n.ts._skinTones.mediumDark, + i18n.ts._skinTones.dark, +]; + const size = computed(() => props.asReactionPicker ? reactionPickerSize.value : 1 ); @@ -232,7 +256,7 @@ watch(q, () => { const newQ = q.value.replace(/:/g, "").toLowerCase(); const searchCustom = () => { - const max = 8; + const max = 16; const emojis = customEmojis; const matches = new Set<Misskey.entities.CustomEmoji>(); @@ -304,11 +328,11 @@ watch(q, () => { }; const searchUnicode = () => { - const max = 8; + const max = 32; const emojis = emojilist; const matches = new Set<UnicodeEmojiDef>(); - const exactMatch = emojis.find((emoji) => emoji.name === newQ); + const exactMatch = emojis.find((emoji) => emoji.slug === newQ); if (exactMatch) matches.add(exactMatch); if (newQ.includes(" ")) { @@ -317,7 +341,7 @@ watch(q, () => { // 名前にキーワードが含まれている for (const emoji of emojis) { - if (keywords.every((keyword) => emoji.name.includes(keyword))) { + if (keywords.every((keyword) => emoji.slug.includes(keyword))) { matches.add(emoji); if (matches.size >= max) break; } @@ -329,8 +353,8 @@ watch(q, () => { if ( keywords.every( (keyword) => - emoji.name.includes(keyword) || - emoji.keywords.some((alias) => + emoji.slug.includes(keyword) || + emoji.keywords?.some((alias) => alias.includes(keyword) ) ) @@ -341,7 +365,7 @@ watch(q, () => { } } else { for (const emoji of emojis) { - if (emoji.name.startsWith(newQ)) { + if (emoji.slug.startsWith(newQ)) { matches.add(emoji); if (matches.size >= max) break; } @@ -350,7 +374,7 @@ watch(q, () => { for (const emoji of emojis) { if ( - emoji.keywords.some((keyword) => keyword.startsWith(newQ)) + emoji.keywords?.some((keyword) => keyword.startsWith(newQ)) ) { matches.add(emoji); if (matches.size >= max) break; @@ -359,7 +383,7 @@ watch(q, () => { if (matches.size >= max) return matches; for (const emoji of emojis) { - if (emoji.name.includes(newQ)) { + if (emoji.slug.includes(newQ)) { matches.add(emoji); if (matches.size >= max) break; } @@ -367,7 +391,7 @@ watch(q, () => { if (matches.size >= max) return matches; for (const emoji of emojis) { - if (emoji.keywords.some((keyword) => keyword.includes(newQ))) { + if (emoji.keywords?.some((keyword) => keyword.includes(newQ))) { matches.add(emoji); if (matches.size >= max) break; } @@ -397,7 +421,7 @@ function reset() { function getKey( emoji: string | Misskey.entities.CustomEmoji | UnicodeEmojiDef ): string { - return typeof emoji === "string" ? emoji : emoji.char || `:${emoji.name}:`; + return typeof emoji === "string" ? emoji : emoji.emoji || `:${emoji.name}:`; } function chosen(emoji: any, ev?: MouseEvent) { @@ -441,7 +465,7 @@ function done(query?: any): boolean | void { return true; } const exactMatchUnicode = emojilist.find( - (emoji) => emoji.char === q2 || emoji.name === q2 + (emoji) => emoji.emoji === q2 || emoji.slug === q2 ); if (exactMatchUnicode) { chosen(exactMatchUnicode); diff --git a/packages/client/src/components/MkEmojiPickerDialog.vue b/packages/client/src/components/MkEmojiPickerDialog.vue index 4cff9f2751..204505e89f 100644 --- a/packages/client/src/components/MkEmojiPickerDialog.vue +++ b/packages/client/src/components/MkEmojiPickerDialog.vue @@ -65,7 +65,11 @@ function chosen(emoji: any) { } function opening() { - picker.value?.reset(); + try { + picker.value?.reset(); + } catch (e) { + console.error(`Something's wrong with restting the emoji picker: ${e}`); + } picker.value?.focus(); } </script> diff --git a/packages/client/src/components/MkFollowButton.vue b/packages/client/src/components/MkFollowButton.vue index bff393fddf..a1c2317e63 100644 --- a/packages/client/src/components/MkFollowButton.vue +++ b/packages/client/src/components/MkFollowButton.vue @@ -20,42 +20,41 @@ :disabled="wait" @click.stop="onClick" :aria-label="`${state} ${user.name || user.username}`" + v-tooltip="full ? null : `${state} ${user.name || user.username}`" > <template v-if="!wait"> <template v-if="isBlocking"> - <span v-if="full">{{ (state = i18n.ts.blocked) }}</span + <span>{{ (state = i18n.ts.blocked) }}</span ><i class="ph-prohibit ph-bold ph-lg"></i> </template> <template v-else-if="hasPendingFollowRequestFromYou && user.isLocked" > - <span v-if="full">{{ - (state = i18n.ts.followRequestPending) - }}</span + <span>{{ (state = i18n.ts.followRequestPending) }}</span ><i class="ph-hourglass-medium ph-bold ph-lg"></i> </template> <template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked" > <!-- つまりリモートフォローの場合。 --> - <span v-if="full">{{ (state = i18n.ts.processing) }}</span + <span>{{ (state = i18n.ts.processing) }}</span ><i class="ph-circle-notch ph-bold ph-lg fa-pulse"></i> </template> <template v-else-if="isFollowing"> - <span v-if="full">{{ (state = i18n.ts.unfollow) }}</span + <span>{{ (state = i18n.ts.unfollow) }}</span ><i class="ph-minus ph-bold ph-lg"></i> </template> <template v-else-if="!isFollowing && user.isLocked"> - <span v-if="full">{{ (state = i18n.ts.followRequest) }}</span + <span>{{ (state = i18n.ts.followRequest) }}</span ><i class="ph-plus ph-bold ph-lg"></i> </template> <template v-else-if="!isFollowing && !user.isLocked"> - <span v-if="full">{{ (state = i18n.ts.follow) }}</span + <span>{{ (state = i18n.ts.follow) }}</span ><i class="ph-plus ph-bold ph-lg"></i> </template> </template> <template v-else> - <span v-if="full">{{ (state = i18n.ts.processing) }}</span + <span>{{ (state = i18n.ts.processing) }}</span ><i class="ph-circle-notch ph-bold ph-lg fa-pulse ph-fw ph-lg"></i> </template> </button> @@ -185,6 +184,7 @@ onBeforeUnmount(() => { .menu { width: 3em; height: 2em; + vertical-align: middle; } .follow-button { position: relative; @@ -200,6 +200,7 @@ onBeforeUnmount(() => { height: 2em; border-radius: 100px; background: var(--bg); + vertical-align: middle; &.full { padding: 0.2em 0.7em; @@ -215,6 +216,9 @@ onBeforeUnmount(() => { &:not(.full) { width: 31px; + span { + display: none; + } } &:focus-visible { diff --git a/packages/client/src/components/MkLaunchPad.vue b/packages/client/src/components/MkLaunchPad.vue index b1f42ec76b..bc268f2e95 100644 --- a/packages/client/src/components/MkLaunchPad.vue +++ b/packages/client/src/components/MkLaunchPad.vue @@ -29,7 +29,12 @@ > <i class="icon" :class="item.icon"></i> <div class="text">{{ item.text }}</div> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -41,7 +46,12 @@ > <i class="icon" :class="item.icon"></i> <div class="text">{{ item.text }}</div> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </MkA> @@ -163,13 +173,16 @@ function close() { left: 32px; color: var(--indicator); font-size: 8px; - animation: blink 1s infinite; @media (max-width: 500px) { top: 16px; left: 16px; } } + + > .animateIndicator { + animation: blink 1s infinite; + } } } diff --git a/packages/client/src/components/MkMedia.vue b/packages/client/src/components/MkMedia.vue new file mode 100644 index 0000000000..ad4bca0e02 --- /dev/null +++ b/packages/client/src/components/MkMedia.vue @@ -0,0 +1,241 @@ +<template> + <div class="media" :class="{ mini: plyrMini }"> + <button v-if="hide" class="hidden" @click="hide = false"> + <ImgWithBlurhash + :hash="media.blurhash" + :title="media.comment" + :alt="media.comment" + /> + <div class="text"> + <div class="wrapper"> + <b style="display: block" + ><i class="ph-warning ph-bold ph-lg"></i> + {{ i18n.ts.sensitive }}</b + > + <span style="display: block">{{ + i18n.ts.clickToShow + }}</span> + </div> + </div> + </button> + <template v-else> + <a v-if="media.type.startsWith('image')" :href="media.url"> + <ImgWithBlurhash + :hash="media.blurhash" + :src="url" + :alt="media.comment" + :type="media.type" + :cover="false" + /> + <div v-if="media.type === 'image/gif'" class="gif">GIF</div> + </a> + <VuePlyr + v-if="media.type.startsWith('video')" + ref="plyr" + :options="{ + controls: [ + 'play-large', + 'play', + 'progress', + 'current-time', + 'mute', + 'volume', + 'pip', + 'download', + 'fullscreen', + ], + disableContextMenu: false, + }" + > + <video + :poster="media.thumbnailUrl" + :aria-label="media.comment" + preload="none" + controls + @contextmenu.stop + > + <source :src="media.url" :type="media.type" /> + </video> + </VuePlyr> + </template> + <div class="buttons"> + <button + v-if="media.comment" + v-tooltip="i18n.ts.alt" + class="_button" + @click.stop="captionPopup" + > + <i class="ph-subtitles ph-bold ph-lg"></i> + </button> + <button + v-if="!hide" + v-tooltip="i18n.ts.hide" + class="_button" + @click.stop="hide = true" + > + <i class="ph-eye-slash ph-bold ph-lg"></i> + </button> + </div> + </div> +</template> + +<script lang="ts" setup> +import { watch, ref, onMounted } from "vue"; +import VuePlyr from "vue-plyr"; +import "vue-plyr/dist/vue-plyr.css"; +import type * as misskey from "calckey-js"; +import { getStaticImageUrl } from "@/scripts/get-static-image-url"; +import ImgWithBlurhash from "@/components/MkImgWithBlurhash.vue"; +import { defaultStore } from "@/store"; +import { i18n } from "@/i18n"; +import * as os from "@/os"; + +const props = defineProps<{ + media: misskey.entities.DriveFile; + raw?: boolean; +}>(); + +let hide = $ref(true); + +const plyr = ref(); +const plyrMini = ref(false); + +const url = + props.raw || defaultStore.state.loadRawImages + ? props.media.url + : defaultStore.state.disableShowingAnimatedImages + ? getStaticImageUrl(props.media.thumbnailUrl) + : props.media.thumbnailUrl; + +function captionPopup() { + os.alert({ + type: "info", + text: props.media.comment, + }); +} + +// Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする +watch( + () => props.media, + () => { + hide = + defaultStore.state.nsfw === "force" + ? true + : props.media.isSensitive && + defaultStore.state.nsfw !== "ignore"; + }, + { + deep: true, + immediate: true, + } +); + +onMounted(() => { + if (props.media.type.startsWith("video")) { + plyrMini.value = plyr.value.player.media.scrollWidth < 300; + if (plyrMini.value) { + plyr.value.player.on("play", () => { + plyr.value.player.fullscreen.enter(); + }); + } + } +}); +</script> + +<style lang="scss" scoped> +.hidden { + all: unset; + position: relative; + width: 100%; + height: 100%; + + > .text { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + justify-content: center; + align-items: center; + padding: 30px; + box-sizing: border-box; + background: rgba(0, 0, 0, 0.5); + + > .wrapper { + display: table-cell; + text-align: center; + font-size: 0.8em; + color: #fff; + } + } + + &:focus-visible { + border: 2px solid var(--accent); + } +} + +.media { + position: relative; + background: var(--bg); + + > .buttons { + display: flex; + gap: 4px; + position: absolute; + border-radius: 6px; + overflow: hidden; + top: 12px; + right: 12px; + > * { + background-color: var(--accentedBg); + -webkit-backdrop-filter: var(--blur, blur(15px)); + backdrop-filter: var(--blur, blur(15px)); + color: var(--accent); + font-size: 0.8em; + padding: 6px 8px; + text-align: center; + } + } + + > a { + display: block; + cursor: zoom-in; + overflow: hidden; + width: 100%; + height: 100%; + background-position: center; + background-size: contain; + background-repeat: no-repeat; + box-sizing: border-box; + &:focus-visible { + border: 2px solid var(--accent); + } + + > .gif { + background-color: var(--fg); + border-radius: 6px; + color: var(--accentLighten); + display: inline-block; + font-size: 14px; + font-weight: bold; + left: 12px; + opacity: 0.5; + padding: 0 6px; + text-align: center; + top: 12px; + pointer-events: none; + } + } + &.mini { + :deep(.plyr:not(:fullscreen)) { + min-width: unset !important; + .plyr__control--overlaid, + .plyr__progress__container, + .plyr__volume, + [data-plyr="fullscreen"] { + display: none; + } + } + } +} +</style> diff --git a/packages/client/src/components/MkMediaImage.vue b/packages/client/src/components/MkMediaImage.vue deleted file mode 100644 index 9097a4771c..0000000000 --- a/packages/client/src/components/MkMediaImage.vue +++ /dev/null @@ -1,162 +0,0 @@ -<template> - <button v-if="hide" class="qjewsnkg" @click="hide = false"> - <ImgWithBlurhash - :hash="image.blurhash" - :title="image.comment" - :alt="image.comment" - /> - <div class="text"> - <div class="wrapper"> - <b style="display: block" - ><i class="ph-warning ph-bold ph-lg"></i> - {{ i18n.ts.sensitive }}</b - > - <span style="display: block">{{ i18n.ts.clickToShow }}</span> - </div> - </div> - </button> - <div v-else class="gqnyydlz"> - <a :href="image.url" :title="image.name"> - <ImgWithBlurhash - :hash="image.blurhash" - :src="url" - :alt="image.comment" - :type="image.type" - :title="image.comment" - :cover="false" - /> - <div v-if="image.type === 'image/gif'" class="gif">GIF</div> - </a> - <button - v-tooltip="i18n.ts.hide" - class="_button hide" - @click="hide = true" - > - <i class="ph-eye-slash ph-bold ph-lg"></i> - </button> - </div> -</template> - -<script lang="ts" setup> -import { watch } from "vue"; -import type * as misskey from "calckey-js"; -import { getStaticImageUrl } from "@/scripts/get-static-image-url"; -import ImgWithBlurhash from "@/components/MkImgWithBlurhash.vue"; -import { defaultStore } from "@/store"; -import { i18n } from "@/i18n"; - -const props = defineProps<{ - image: misskey.entities.DriveFile; - raw?: boolean; -}>(); - -let hide = $ref(true); - -const url = - props.raw || defaultStore.state.loadRawImages - ? props.image.url - : defaultStore.state.disableShowingAnimatedImages - ? getStaticImageUrl(props.image.thumbnailUrl) - : props.image.thumbnailUrl; - -// Plugin:register_note_view_interruptor を使って書き換えられる可能性があるためwatchする -watch( - () => props.image, - () => { - hide = - defaultStore.state.nsfw === "force" - ? true - : props.image.isSensitive && - defaultStore.state.nsfw !== "ignore"; - }, - { - deep: true, - immediate: true, - } -); -</script> - -<style lang="scss" scoped> -.qjewsnkg { - all: unset; - position: relative; - - > .text { - position: relative; - width: 100%; - height: 100%; - z-index: 1; - display: flex; - justify-content: center; - align-items: center; - padding: 30px; - box-sizing: border-box; - background: rgba(0, 0, 0, 0.5); - - > .wrapper { - display: table-cell; - text-align: center; - font-size: 0.8em; - color: #fff; - } - } - - &:focus-visible { - border: 2px solid var(--accent); - } -} - -.gqnyydlz { - position: relative; - background: var(--bg); - - > .hide { - display: block; - position: absolute; - border-radius: 6px; - background-color: var(--accentedBg); - -webkit-backdrop-filter: var(--blur, blur(15px)); - backdrop-filter: var(--blur, blur(15px)); - color: var(--accent); - font-size: 0.8em; - padding: 6px 8px; - text-align: center; - top: 12px; - right: 12px; - - > i { - display: block; - } - } - - > a { - display: block; - cursor: zoom-in; - overflow: hidden; - width: 100%; - height: 100%; - background-position: center; - background-size: contain; - background-repeat: no-repeat; - box-sizing: border-box; - &:focus-visible { - border: 2px solid var(--accent); - } - - > .gif { - background-color: var(--fg); - border-radius: 6px; - color: var(--accentLighten); - display: inline-block; - font-size: 14px; - font-weight: bold; - left: 12px; - opacity: 0.5; - padding: 0 6px; - text-align: center; - top: 12px; - pointer-events: none; - } - } -} -</style> diff --git a/packages/client/src/components/MkMediaList.vue b/packages/client/src/components/MkMediaList.vue index c01ccd5d81..83b4122789 100644 --- a/packages/client/src/components/MkMediaList.vue +++ b/packages/client/src/components/MkMediaList.vue @@ -12,25 +12,16 @@ :class="{ dmWidth: inDm }" > <div ref="gallery" @click.stop> - <template + <XMedia v-for="media in mediaList.filter((media) => previewable(media) )" - > - <XVideo - v-if="media.type.startsWith('video')" - :key="media.id" - :video="media" - /> - <XImage - v-else-if="media.type.startsWith('image')" - :key="media.id" - class="image" - :data-id="media.id" - :image="media" - :raw="raw" - /> - </template> + :key="media.id" + :class="{ image: media.type.startsWith('image') }" + :data-id="media.id" + :media="media" + :raw="raw" + /> </div> </div> </div> @@ -43,8 +34,7 @@ import PhotoSwipeLightbox from "photoswipe/lightbox"; import PhotoSwipe from "photoswipe"; import "photoswipe/style.css"; import XBanner from "@/components/MkMediaBanner.vue"; -import XImage from "@/components/MkMediaImage.vue"; -import XVideo from "@/components/MkMediaVideo.vue"; +import XMedia from "@/components/MkMedia.vue"; import * as os from "@/os"; import { FILE_TYPE_BROWSERSAFE } from "@/const"; import { defaultStore } from "@/store"; diff --git a/packages/client/src/components/MkMediaVideo.vue b/packages/client/src/components/MkMediaVideo.vue deleted file mode 100644 index 21f8aceddf..0000000000 --- a/packages/client/src/components/MkMediaVideo.vue +++ /dev/null @@ -1,152 +0,0 @@ -<template> - <div - v-if="hide" - class="icozogqfvdetwohsdglrbswgrejoxbdj" - @click="hide = false" - > - <div> - <b - ><i class="ph-warning ph-bold ph-lg"></i> - {{ i18n.ts.sensitive }}</b - > - <span>{{ i18n.ts.clickToShow }}</span> - </div> - </div> - <div v-else class="video" :class="{ mini }"> - <VuePlyr - ref="plyr" - :options="{ - controls: [ - 'play-large', - 'play', - 'progress', - 'current-time', - 'mute', - 'volume', - 'pip', - 'download', - 'fullscreen', - ], - disableContextMenu: false, - }" - > - <video - :poster="video.thumbnailUrl" - :title="video.comment" - :aria-label="video.comment" - preload="none" - controls - @contextmenu.stop - > - <source :src="video.url" :type="video.type" /> - </video> - </VuePlyr> - <button - v-tooltip="i18n.ts.hide" - class="_button hide" - @click="hide = true" - > - <i class="ph-eye-slash ph-bold ph-lg"></i> - </button> - </div> -</template> - -<script lang="ts" setup> -import { onMounted, ref } from "vue"; -import VuePlyr from "vue-plyr"; -import type * as misskey from "calckey-js"; -import { defaultStore } from "@/store"; -import "vue-plyr/dist/vue-plyr.css"; -import { i18n } from "@/i18n"; - -const props = defineProps<{ - video: misskey.entities.DriveFile; -}>(); - -const plyr = ref(); -const mini = ref(false); - -const hide = ref( - defaultStore.state.nsfw === "force" - ? true - : props.video.isSensitive && defaultStore.state.nsfw !== "ignore" -); - -onMounted(() => { - mini.value = plyr.value.player.media.scrollWidth < 300; - if (mini.value) { - plyr.value.player.on("play", () => { - plyr.value.player.fullscreen.enter(); - }); - } -}); -</script> - -<style lang="scss" scoped> -.video { - position: relative; - --plyr-color-main: var(--accent); - - > .hide { - display: block; - position: absolute; - border-radius: 6px; - background-color: var(--accentedBg); - -webkit-backdrop-filter: var(--blur, blur(15px)); - backdrop-filter: var(--blur, blur(15px)); - color: var(--accent); - font-size: 0.8em; - padding: 6px 8px; - text-align: center; - top: 12px; - right: 12px; - - > i { - display: block; - } - } - - > video { - display: flex; - justify-content: center; - align-items: center; - - font-size: 3.5em; - overflow: hidden; - background-position: center; - background-size: cover; - width: 100%; - height: 100%; - } - - &.mini { - :deep(.plyr:not(:fullscreen)) { - min-width: unset !important; - .plyr__control--overlaid, - .plyr__progress__container, - .plyr__volume, - [data-plyr="fullscreen"] { - display: none; - } - } - } -} - -.icozogqfvdetwohsdglrbswgrejoxbdj { - display: flex; - justify-content: center; - align-items: center; - background: #111; - color: #fff; - - > div { - display: table-cell; - text-align: center; - font-size: 12px; - - > b { - display: block; - } - } -} -</style> diff --git a/packages/client/src/components/MkMenu.vue b/packages/client/src/components/MkMenu.vue index dcc6efe7d0..aa3a3a3000 100644 --- a/packages/client/src/components/MkMenu.vue +++ b/packages/client/src/components/MkMenu.vue @@ -1,10 +1,11 @@ <template> <FocusTrap - :active="false" ref="focusTrap" + v-model:active="isActive" :return-focus-on-deactivate="!noReturnFocus" + @deactivate="emit('close')" > - <div tabindex="-1"> + <div> <div ref="itemsEl" class="rrevdjwt _popup _shadow" @@ -14,6 +15,7 @@ maxHeight: maxHeight ? maxHeight + 'px' : '', }" @contextmenu.self="(e) => e.preventDefault()" + tabindex="-1" > <template v-for="(item, i) in items2"> <div v-if="item === null" class="divider"></div> @@ -50,7 +52,12 @@ <span :style="item.textStyle || ''">{{ item.text }}</span> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </MkA> @@ -72,7 +79,12 @@ <span :style="item.textStyle || ''">{{ item.text }}</span> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </a> @@ -90,7 +102,12 @@ class="avatar" disableLink /><MkUserName :user="item.user" /> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -113,7 +130,7 @@ class="_button item parent" :class="{ childShowing: childShowingItem === item }" @mouseenter="showChildren(item, $event)" - @click="showChildren(item, $event)" + @click.stop="showChildren(item, $event)" > <i v-if="item.icon" @@ -156,7 +173,12 @@ <span :style="item.textStyle || ''">{{ item.text }}</span> - <span v-if="item.indicate" class="indicator" + <span + v-if="item.indicate" + class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -173,6 +195,7 @@ :root-element="itemsEl" showing @actioned="childActioned" + @closed="closeChild" /> </div> </div> @@ -303,23 +326,7 @@ function close(actioned = false) { emit("close", actioned); } -function focusUp() { - focusPrev(document.activeElement); -} - -function focusDown() { - focusNext(document.activeElement); -} - onMounted(() => { - focusTrap.value.activate(); - - if (props.viaKeyboard) { - nextTick(() => { - focusNext(itemsEl.children[0], true, false); - }); - } - document.addEventListener("mousedown", onGlobalMousedown, { passive: true, }); @@ -496,6 +503,9 @@ onBeforeUnmount(() => { left: 13px; color: var(--indicator); font-size: 12px; + } + + > .animateIndicator { animation: blink 1s infinite; } } diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue index 6a66c1787e..e814c91e5b 100644 --- a/packages/client/src/components/MkModal.vue +++ b/packages/client/src/components/MkModal.vue @@ -201,9 +201,6 @@ function close(ev, opts: { useSendAnimation?: boolean } = {}) { function onBgClick() { if (contentClicking) return; - if (!props.noReturnFocus) { - focusedElement.focus(); - } emit("click"); } diff --git a/packages/client/src/components/MkModalWindow.vue b/packages/client/src/components/MkModalWindow.vue index 9406d8d4dd..740f84d6b0 100644 --- a/packages/client/src/components/MkModalWindow.vue +++ b/packages/client/src/components/MkModalWindow.vue @@ -11,24 +11,24 @@ ref="rootEl" class="ebkgoccj" :style="{ - width: `${width}px`, + width: `${props.width}px`, height: scroll ? height - ? `${height}px` + ? `${props.height}px` : null : height - ? `min(${height}px, 100%)` + ? `min(${props.height}px, 100%)` : '100%', }" - @keydown="onKeydown" tabindex="-1" > <div ref="headerEl" class="header"> <button - v-if="withOkButton" + v-if="props.withOkButton" :aria-label="i18n.t('close')" class="_button" @click="$emit('close')" + v-tooltip="i18n.ts.close" > <i class="ph-x ph-bold ph-lg"></i> </button> @@ -36,7 +36,7 @@ <slot name="header"></slot> </span> <button - v-if="!withOkButton" + v-if="!props.withOkButton" :aria-label="i18n.t('close')" class="_button" @click="$emit('close')" @@ -44,10 +44,10 @@ <i class="ph-x ph-bold ph-lg"></i> </button> <button - v-if="withOkButton" + v-if="props.withOkButton" :aria-label="i18n.t('ok')" class="_button" - :disabled="okButtonDisabled" + :disabled="props.okButtonDisabled" @click="$emit('ok')" > <i class="ph-check ph-bold ph-lg"></i> @@ -94,8 +94,8 @@ let modal = $shallowRef<InstanceType<typeof MkModal>>(); let rootEl = $shallowRef<HTMLElement>(); let headerEl = $shallowRef<HTMLElement>(); -const close = () => { - modal.close(); +const close = (ev) => { + modal?.close(ev); }; const onBgClick = () => { diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 19205e0d99..18961bed42 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -12,11 +12,18 @@ :id="appearNote.id" > <MkNoteSub - v-if="appearNote.reply && !detailedView" + v-if="appearNote.reply && !detailedView && !collapsedReply" :note="appearNote.reply" class="reply-to" /> - <div v-if="!detailedView" class="note-context" @click="noteClick"> + <div + v-if="!detailedView" + class="note-context" + @click="noteClick" + :class="{ + collapsedReply: collapsedReply && appearNote.reply, + }" + > <div class="line"></div> <div v-if="appearNote._prId_" class="info"> <i class="ph-megaphone-simple-bold ph-lg"></i> @@ -63,6 +70,20 @@ <MkVisibility :note="note" /> </div> </div> + <div v-if="collapsedReply && appearNote.reply" class="info"> + <MkAvatar class="avatar" :user="appearNote.reply.user" /> + <MkUserName + class="username" + :user="appearNote.reply.user" + ></MkUserName> + <Mfm + class="summary" + :text="getNoteSummary(appearNote.reply)" + :plain="true" + :nowrap="true" + :custom-emojis="note.emojis" + /> + </div> </div> <article class="article" @@ -75,11 +96,7 @@ <div class="main"> <div class="header-container"> <MkAvatar class="avatar" :user="appearNote.user" /> - <XNoteHeader - class="header" - :note="appearNote" - :mini="true" - /> + <XNoteHeader class="header" :note="appearNote" /> </div> <div class="body"> <MkSubNoteContent @@ -190,6 +207,7 @@ ref="reactButton" class="button _button reacted" @click="undoReact(appearNote)" + v-tooltip.noDelay.bottom="i18n.ts.removeReaction" > <i class="ph-minus ph-bold ph-lg"></i> </button> @@ -206,7 +224,12 @@ </div> </article> </div> - <button v-else class="muted _button" @click="muted.muted = false"> + <button + v-else + class="muted _button" + @click="muted.muted = false" + @contextmenu.stop.prevent + > <I18n :src="softMuteReasonI18nSrc(muted.what)" tag="small"> <template #name> <MkA @@ -259,6 +282,7 @@ import { getNoteMenu } from "@/scripts/get-note-menu"; import { useNoteCapture } from "@/scripts/use-note-capture"; import { notePage } from "@/filters/note"; import { deepClone } from "@/scripts/clone"; +import { getNoteSummary } from "@/scripts/get-note-summary"; const router = useRouter(); @@ -266,6 +290,7 @@ const props = defineProps<{ note: misskey.entities.Note; pinned?: boolean; detailedView?: boolean; + collapsedReply?: boolean; }>(); const inChannel = inject("inChannel", null); @@ -618,19 +643,20 @@ defineExpose({ .line::before { content: ""; display: block; - margin-bottom: -10px; + margin-bottom: -4px; margin-top: 16px; - border-left: 2px solid var(--X13); + border-left: 2px solid currentColor; margin-left: calc((var(--avatarSize) / 2) - 1px); + opacity: 0.25; } } } .note-context { position: relative; - z-index: 2; padding: 0 32px 0 32px; display: flex; + z-index: 1; &:first-child { margin-top: 20px; } @@ -709,12 +735,56 @@ defineExpose({ } } } + + &.collapsedReply { + .line { + opacity: 0.25; + &::after { + content: ""; + position: absolute; + border-left: 2px solid currentColor; + border-top: 2px solid currentColor; + margin-left: calc(var(--avatarSize) / 2 - 1px); + width: calc(var(--avatarSize) / 2 + 14px); + border-top-left-radius: calc(var(--avatarSize) / 4); + top: calc(50% - 1px); + height: calc(50% + 5px); + } + } + .info { + color: var(--fgTransparentWeak); + transition: color 0.2s; + } + .avatar { + width: 1.2em; + height: 1.2em; + border-radius: 2em; + overflow: hidden; + margin-right: 0.4em; + background: var(--panelHighlight); + } + .username { + font-weight: 700; + flex-shrink: 0; + max-width: 30%; + &::after { + content: ": "; + } + } + &:hover, + &:focus-within { + .info { + color: var(--fg); + } + } + } } > .article { position: relative; overflow: clip; - padding: 4px 32px 10px; + padding: 20px 32px 10px; + margin-top: -16px; &:first-child, &:nth-child(2) { @@ -728,6 +798,8 @@ defineExpose({ .header-container { display: flex; + position: relative; + z-index: 2; > .avatar { flex-shrink: 0; display: block; @@ -861,7 +933,7 @@ defineExpose({ } } > .article { - padding: 4px 16px 8px; + padding: 18px 16px 8px; &:first-child, &:nth-child(2) { padding-top: 104px; @@ -887,5 +959,8 @@ defineExpose({ ._blur_text { pointer-events: auto; } + &:active ._blur_text { + filter: blur(0px); + } } </style> diff --git a/packages/client/src/components/MkNoteHeader.vue b/packages/client/src/components/MkNoteHeader.vue index dc8b71d935..b25ffa3292 100644 --- a/packages/client/src/components/MkNoteHeader.vue +++ b/packages/client/src/components/MkNoteHeader.vue @@ -18,17 +18,21 @@ <div class="info"> <MkA class="created-at" :to="notePage(note)"> <MkTime :time="note.createdAt" /> - <MkTime + <i v-if="note.updatedAt" - :time="note.updatedAt" - mode="none" - > - <i - v-tooltip.noDelay="i18n.ts.edited" - class="ph-pencil ph-bold" - style="margin-left: 0.4rem" - ></i> - </MkTime> + v-tooltip.noDelay=" + i18n.t('edited', { + date: new Date( + note.updatedAt + ).toLocaleDateString(), + time: new Date( + note.updatedAt + ).toLocaleTimeString(), + }) + " + class="ph-pencil ph-bold" + style="margin-left: 0.4rem" + ></i> </MkA> <MkVisibility :note="note" /> </div> diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue index 813eab7ae3..12b8ac4847 100644 --- a/packages/client/src/components/MkNoteSub.vue +++ b/packages/client/src/components/MkNoteSub.vue @@ -119,6 +119,7 @@ ref="reactButton" class="button _button reacted" @click="undoReact(appearNote)" + v-tooltip.noDelay.bottom="i18n.ts.removeReaction" > <i class="ph-minus ph-bold ph-lg"></i> </button> @@ -430,6 +431,7 @@ function noteClick(e) { > .avatar-container { margin-right: 8px; + z-index: 2; > .avatar { flex-shrink: 0; display: block; @@ -650,10 +652,11 @@ function noteClick(e) { flex-grow: 1; margin-bottom: -10px; pointer-events: none; + opacity: 0.25; &::before { content: ""; position: absolute; - border-left: 2px solid var(--X13); + border-left: 2px solid currentColor; margin-left: calc((var(--avatarSize) / 2) - 1px); width: calc(var(--indent) / 2); inset-block: 0; @@ -691,11 +694,12 @@ function noteClick(e) { z-index: 2; left: 0; top: 0; + opacity: 0.25; &::after { content: ""; position: absolute; - border-left: 2px solid var(--X13); - border-bottom: 2px solid var(--X13); + border-left: 2px solid currentColor; + border-bottom: 2px solid currentColor; margin-left: calc((var(--avatarSize) / 2) - 1px); width: calc(var(--indent) / 2); height: calc((var(--avatarSize) / 2)); diff --git a/packages/client/src/components/MkNotes.vue b/packages/client/src/components/MkNotes.vue index bf3631c182..5916621840 100644 --- a/packages/client/src/components/MkNotes.vue +++ b/packages/client/src/components/MkNotes.vue @@ -12,7 +12,7 @@ </template> <template #default="{ items: notes }"> - <div class="giivymft" :class="{ noGap }"> + <div class="giivymft" :class="{ noGap }" ref="tlEl"> <XList ref="notes" v-slot="{ item: note }" @@ -41,6 +41,9 @@ import XNote from "@/components/MkNote.vue"; import XList from "@/components/MkDateSeparatedList.vue"; import MkPagination from "@/components/MkPagination.vue"; import { i18n } from "@/i18n"; +import { scroll } from "@/scripts/scroll"; + +const tlEl = ref<HTMLElement>(); const props = defineProps<{ pagination: Paging; @@ -49,8 +52,13 @@ const props = defineProps<{ const pagingComponent = ref<InstanceType<typeof MkPagination>>(); +function scrollTop() { + scroll(tlEl.value, { top: 0, behavior: "smooth" }); +} + defineExpose({ pagingComponent, + scrollTop, }); </script> diff --git a/packages/client/src/components/MkNotifications.vue b/packages/client/src/components/MkNotifications.vue index 61b16b16e2..439a1d41e9 100644 --- a/packages/client/src/components/MkNotifications.vue +++ b/packages/client/src/components/MkNotifications.vue @@ -26,6 +26,11 @@ " :key="notification.id" :note="notification.note" + :collapsedReply=" + notification.type === 'reply' || + (notification.type === 'mention' && + notification.note.replyId != null) + " /> <XNotification v-else diff --git a/packages/client/src/components/MkPoll.vue b/packages/client/src/components/MkPoll.vue index db4c3350ff..1fdbc7a422 100644 --- a/packages/client/src/components/MkPoll.vue +++ b/packages/client/src/components/MkPoll.vue @@ -34,23 +34,25 @@ </ul> <p v-if="!readOnly"> <span>{{ i18n.t("_poll.totalVotes", { n: total }) }}</span> - <span> · </span> - <a - v-if="!closed && !isVoted" - @click.stop="showResult = !showResult" - >{{ + <span v-if="!closed && !isVoted"> + <span> · </span> + <a @click.stop="showResult = !showResult">{{ showResult ? i18n.ts._poll.vote : i18n.ts._poll.showResult - }}</a - > - <span v-if="isVoted">{{ i18n.ts._poll.voted }}</span> - <span v-else-if="closed">{{ i18n.ts._poll.closed }}</span> + }}</a> + </span> + <span v-if="!isLocal"> + <span> · </span> + <a @click.stop="refresh">{{ i18n.ts.reload }}</a> + </span> + <span v-if="isVoted"> · {{ i18n.ts._poll.voted }}</span> + <span v-else-if="closed"> · {{ i18n.ts._poll.closed }}</span> <span v-if="remaining > 0"> · {{ timer }}</span> </p> </div> </template> <script lang="ts" setup> -import { computed, onUnmounted, ref, toRef } from "vue"; +import { computed, ref } from "vue"; import * as misskey from "calckey-js"; import { sum } from "@/scripts/array"; import { pleaseLogin } from "@/scripts/please-login"; @@ -67,6 +69,7 @@ const remaining = ref(-1); const total = computed(() => sum(props.note.poll.choices.map((x) => x.votes))); const closed = computed(() => remaining.value === 0); +const isLocal = computed(() => !props.note.uri); const isVoted = computed( () => !props.note.poll.multiple && @@ -112,6 +115,14 @@ if (props.note.poll.expiresAt) { }); } +async function refresh() { + if (!props.note.uri) return; + const obj = await os.apiWithDialog("ap/show", { uri: props.note.uri }); + if (obj.type === "Note" && obj.object.poll) { + props.note.poll = obj.object.poll; + } +} + const vote = async (id) => { pleaseLogin(); diff --git a/packages/client/src/components/MkPopupMenu.vue b/packages/client/src/components/MkPopupMenu.vue index f2afcecf24..12a18221cd 100644 --- a/packages/client/src/components/MkPopupMenu.vue +++ b/packages/client/src/components/MkPopupMenu.vue @@ -5,10 +5,9 @@ :z-priority="'high'" :src="src" :transparent-bg="true" - @click="modal.close()" + @click="modal?.close()" @closed="emit('closed')" tabindex="-1" - v-focus > <MkMenu :items="items" @@ -19,7 +18,7 @@ class="sfhdhdhq" :class="{ drawer: type === 'drawer' }" :no-return-focus="noReturnFocus" - @close="modal.close()" + @close="modal?.close()" /> </MkModal> </template> diff --git a/packages/client/src/components/MkPostForm.vue b/packages/client/src/components/MkPostForm.vue index 107ef8cdbe..16acfcc1c9 100644 --- a/packages/client/src/components/MkPostForm.vue +++ b/packages/client/src/components/MkPostForm.vue @@ -14,6 +14,7 @@ <i class="ph-x ph-bold ph-lg"></i> </button> <button + v-if="$props.editId == null" v-click-anime v-tooltip="i18n.ts.switchAccount" class="account _button" diff --git a/packages/client/src/components/MkReactedUsers.vue b/packages/client/src/components/MkReactedUsers.vue index 97bade8461..23d3aaa7a1 100644 --- a/packages/client/src/components/MkReactedUsers.vue +++ b/packages/client/src/components/MkReactedUsers.vue @@ -1,5 +1,5 @@ <template> - <div v-if="note" class="_gaps reacted-users"> + <div v-if="note" class="reacted-users"> <div :class="$style.tabs"> <button v-for="reaction in reactions" diff --git a/packages/client/src/components/MkReactionsViewer.reaction.vue b/packages/client/src/components/MkReactionsViewer.reaction.vue index 461628a94a..d82e134278 100644 --- a/packages/client/src/components/MkReactionsViewer.reaction.vue +++ b/packages/client/src/components/MkReactionsViewer.reaction.vue @@ -36,6 +36,10 @@ const props = defineProps<{ note: misskey.entities.Note; }>(); +const emit = defineEmits<{ + (ev: "reacted", v): void; +}>(); + const buttonRef = ref<HTMLElement>(); const canToggle = computed(() => !props.reaction.match(/@\w/) && $i); @@ -60,6 +64,7 @@ const toggleReaction = () => { noteId: props.note.id, reaction: props.reaction, }); + emit("reacted"); } }; @@ -101,6 +106,7 @@ useTooltip( padding: 0 6px; border-radius: 4px; pointer-events: all; + min-width: max-content; &.newlyAdded { animation: scaleInSmall 0.3s cubic-bezier(0, 0, 0, 1.2); :deep(.mk-emoji) { @@ -132,6 +138,7 @@ useTooltip( } &.reacted { + order: -1; background: var(--accent); &:hover { diff --git a/packages/client/src/components/MkReactionsViewer.vue b/packages/client/src/components/MkReactionsViewer.vue index fc108b4729..b60c53df6b 100644 --- a/packages/client/src/components/MkReactionsViewer.vue +++ b/packages/client/src/components/MkReactionsViewer.vue @@ -1,5 +1,5 @@ <template> - <div class="tdflqwzn" :class="{ isMe }"> + <div ref="reactionsEl" class="reactions-list tdflqwzn" :class="{ isMe }"> <XReaction v-for="(count, reaction) in note.reactions" :key="reaction" @@ -7,12 +7,13 @@ :count="count" :is-initial="initialReactions.has(reaction)" :note="note" + @reacted="reactionsEl.scrollTo(0, 0)" /> </div> </template> <script lang="ts" setup> -import { computed } from "vue"; +import { computed, ref } from "vue"; import * as misskey from "calckey-js"; import { $i } from "@/account"; import XReaction from "@/components/MkReactionsViewer.reaction.vue"; @@ -21,16 +22,37 @@ const props = defineProps<{ note: misskey.entities.Note; }>(); +const reactionsEl = ref<HTMLElement>(); + const initialReactions = new Set(Object.keys(props.note.reactions)); const isMe = computed(() => $i && $i.id === props.note.userId); </script> <style lang="scss" scoped> -.tdflqwzn { - margin-inline: -2px; +.reactions-list { margin-top: 0.2em; width: 100%; + display: flex; + overflow-x: auto; + margin-inline: -24px; + padding-inline: 22px 160px; + mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 160px), + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 160px), + transparent + ); + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } &:empty { display: none; diff --git a/packages/client/src/components/MkRemoteCaution.vue b/packages/client/src/components/MkRemoteCaution.vue index f8a84e81e2..23a7a731b5 100644 --- a/packages/client/src/components/MkRemoteCaution.vue +++ b/packages/client/src/components/MkRemoteCaution.vue @@ -1,5 +1,5 @@ <template> - <div class="jmgmzlwq _block"> + <div class="caution _block"> {{ i18n.ts.remoteUserCaution }}<a class="link" @@ -20,7 +20,7 @@ defineProps<{ </script> <style lang="scss" scoped> -.jmgmzlwq { +.caution { padding: 16px; font-size: 90%; background: var(--infoWarnBg); diff --git a/packages/client/src/components/MkSignin.vue b/packages/client/src/components/MkSignin.vue index 634d5932e8..cebfda8d3a 100644 --- a/packages/client/src/components/MkSignin.vue +++ b/packages/client/src/components/MkSignin.vue @@ -102,14 +102,15 @@ <MkInput v-model="token" type="text" - pattern="^[0-9]{6}$" autocomplete="one-time-code" + pattern="^[0-9]{6}$" :spellcheck="false" required > - <template #prefix> - <i class="ph-poker-chip ph-bold ph-lg"></i> - </template> + <template #label>{{ i18n.ts._2fa.token }}</template> + <template #prefix + ><i class="ph-poker-chip ph-bold ph-lg"></i + ></template> </MkInput> <MkButton type="submit" @@ -159,6 +160,7 @@ </template> <script lang="ts" setup> +import Vue3OtpInput from "vue3-otp-input"; import { defineAsyncComponent } from "vue"; import { toUnicode } from "punycode/"; import MkButton from "@/components/MkButton.vue"; @@ -184,6 +186,10 @@ let queryingKey = $ref(false); let hCaptchaResponse = $ref(null); let reCaptchaResponse = $ref(null); +const updateToken = (value: string) => { + token = value.toString(); +}; + const meta = $computed(() => instance); const emit = defineEmits<{ diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index ea1142e13e..586c3678c8 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -209,16 +209,15 @@ const emit = defineEmits<{ const cwButton = ref<HTMLElement>(); const showMoreButton = ref<HTMLElement>(); + const isLong = !props.detailedView && - ((props.note.cw == null && - props.note.text != null && + props.note.cw == null && + ((props.note.text != null && (props.note.text.split("\n").length > 10 || props.note.text.length > 800)) || props.note.files.length > 4); - const collapsed = $ref(props.note.cw == null && isLong); - const urls = props.note.text ? extractUrlFromMfm(mfm.parse(props.note.text)).slice(0, 5) : null; diff --git a/packages/client/src/components/MkTimeline.vue b/packages/client/src/components/MkTimeline.vue index c3366c17ac..8c57a29ef5 100644 --- a/packages/client/src/components/MkTimeline.vue +++ b/packages/client/src/components/MkTimeline.vue @@ -9,16 +9,26 @@ <template #icon></template> </I18n> </MkInfo> + <div v-if="queue > 0" class="new"> + <button + class="_buttonPrimary _shadow" + @click="tlComponent.scrollTop()" + :class="{ instant: !$store.state.animation }" + > + {{ i18n.ts.newNoteRecived }} + <i class="ph-arrow-up ph-bold"></i> + </button> + </div> <XNotes ref="tlComponent" :no-gap="!$store.state.showGapBetweenNotesInTimeline" :pagination="pagination" - @queue="emit('queue', $event)" + @queue="(x) => (queue = x)" /> </template> <script lang="ts" setup> -import { ref, computed, provide, onUnmounted } from "vue"; +import { ref, watch, computed, provide, onUnmounted } from "vue"; import XNotes from "@/components/MkNotes.vue"; import MkInfo from "@/components/MkInfo.vue"; import * as os from "@/os"; @@ -36,6 +46,8 @@ const props = defineProps<{ sound?: boolean; }>(); +let queue = $ref(0); + const emit = defineEmits<{ (ev: "note"): void; (ev: "queue", count: number): void; @@ -229,3 +241,72 @@ const timetravel = (date?: Date) => { }; */ </script> +<style lang="scss" scoped> +@keyframes slideUp { + to { + transform: translateY(-100%); + opacity: 0; + } +} +.new { + position: sticky; + display: flex; + justify-content: center; + top: calc(var(--stickyTop, 0px) - 60px); + width: 600px; + max-width: 100%; + height: 60px; + pointer-events: none; + margin: auto; + margin-top: -60px; + z-index: 1001; + box-shadow: 0 24px 24px -20px var(--accentedBg); + &::after { + content: ""; + position: absolute; + inset: -2px 0; + border: 2px solid var(--accentDarken); + mask: linear-gradient( + to right, + transparent, + black 40% 60%, + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 40% 60%, + transparent + ); + } + > button { + display: flex; + position: absolute; + top: 120%; + margin-inline: auto; + border-radius: 2em; + padding: 0.5em 1.2em; + background: var(--accentedBg); + border: 0; + color: var(--accent); + overflow: hidden; + pointer-events: all; + transform: translateY(-100%); + opacity: 0; + animation: reset 0.4s forwards cubic-bezier(0, 0.4, 0, 1.1), + slideUp 1s 5s forwards cubic-bezier(1, 0, 1, 1); + &::before { + content: ""; + position: absolute; + inset: 0; + background: var(--bg); + z-index: -1; + } + i { + margin-left: 0.7em; + border-left: 1px solid var(--accentedBg); + padding-left: 0.4em; + } + } +} +</style> diff --git a/packages/client/src/components/MkUrlPreview.vue b/packages/client/src/components/MkUrlPreview.vue index 3706f78858..ec6933c8fd 100644 --- a/packages/client/src/components/MkUrlPreview.vue +++ b/packages/client/src/components/MkUrlPreview.vue @@ -1,121 +1,116 @@ <template> - <div - v-if="playerEnabled" - class="player" - :style="`padding: ${ - ((player.height || 0) / (player.width || 1)) * 100 - }% 0 0`" - @click.stop + <transition + :name="defaultStore.state.animation ? 'zoom' : ''" + mode="out-in" > - <button - class="disablePlayer" - :title="i18n.ts.disablePlayer" - @click="playerEnabled = false" - > - <i class="ph-x ph-bold ph-lg"></i> - </button> - <iframe - :src=" - player.url + - (player.url.match(/\?/) - ? '&autoplay=1&auto_play=1' - : '?autoplay=1&auto_play=1') - " - :width="player.width || '100%'" - :heigth="player.height || 250" - frameborder="0" - allow="autoplay; encrypted-media" - allowfullscreen - /> - </div> - <div - v-else-if="tweetId && tweetExpanded" - ref="twitter" - class="twitter" - @click.stop - > - <iframe - ref="tweet" - scrolling="no" - frameborder="no" - :style="{ - position: 'relative', - width: '100%', - height: `${tweetHeight}px`, - }" - :src="`https://platform.twitter.com/embed/index.html?embedId=${embedId}&hideCard=false&hideThread=false&lang=en&theme=${ - $store.state.darkMode ? 'dark' : 'light' - }&id=${tweetId}`" - ></iframe> - </div> - <div v-else v-size="{ max: [400, 350] }" class="mk-url-preview" @click.stop> - <transition :name="$store.state.animation ? 'zoom' : ''" mode="out-in"> + <!-- v-if="!fetching" for now, I think there's something + weird w/ some links stuck loading (?) --> + <article v-if="!fetching" class="url-preview" @click.stop> <component :is="self ? 'MkA' : 'a'" - v-if="!fetching" - class="link" - :class="{ compact }" - :[attr]="self ? url.substr(local.length) : url" + :[attr]="self ? url.substring(local.length) : url" rel="nofollow noopener" :target="target" :title="url" + :class="{ + hasButton: tweetId || player.url, + }" > - <div - v-if="thumbnail" - class="thumbnail" - :style="`background-image: url('${thumbnail}')`" - > + <div v-if="thumbnail" class="thumbnail"> + <img :src="thumbnail" loading="lazy" /> <button - v-if="!playerEnabled && player.url" + v-if="tweetId" class="_button" - :title="i18n.ts.enablePlayer" - @click.prevent="playerEnabled = true" + v-tooltip=" + tweetExpanded ? i18n.ts.close : i18n.ts.expandTweet + " + @click.stop.prevent="tweetExpanded = !tweetExpanded" > - <i class="ph-play-circle ph-bold ph-lg"></i> + <i + v-if="!tweetExpanded" + class="ph-twitter-logo ph-bold ph-lg" + ></i> + <i v-else class="ph-x ph-bold ph-lg"></i> + </button> + <button + v-else-if="player.url" + class="_button" + v-tooltip=" + playerEnabled ? i18n.ts.close : i18n.ts.enablePlayer + " + @click.stop.prevent="playerEnabled = !playerEnabled" + > + <i + v-if="!playerEnabled" + class="ph-play ph-bold ph-lg" + ></i> + <i v-else class="ph-x ph-bold ph-lg"></i> </button> </div> - <article> - <header> - <h1 :title="title">{{ title }}</h1> - </header> - <p v-if="description" :title="description"> - {{ - description.length > 85 - ? description.slice(0, 85) + "…" - : description - }} + <div v-if="fetching"> + <MkLoading mini /> + </div> + <div v-else> + <h1 :title="title || undefined">{{ title || url }}</h1> + <p :title="description"> + <span> + <span :title="sitename || undefined"> + <img v-if="icon" class="icon" :src="icon" /> + {{ sitename }} + </span> + {{ description }} + </span> </p> - <footer> - <img v-if="icon" class="icon" :src="icon" /> - <p :title="sitename">{{ sitename }}</p> - </footer> - </article> + </div> </component> - </transition> - <div v-if="tweetId" class="expand-tweet"> - <MkButton mini rounded @click="tweetExpanded = true"> - <i class="ph-twitter-logo ph-bold ph-lg"></i> - {{ i18n.ts.expandTweet }} - </MkButton> - </div> - </div> + <iframe + v-if="playerEnabled" + :src=" + player.url + + (player.url.match(/\?/) + ? '&autoplay=1&auto_play=1' + : '?autoplay=1&auto_play=1') + " + :style="`aspect-ratio: ${ + (player.width || 1) / (player.height || 1) + }`" + frameborder="0" + allow="autoplay; encrypted-media" + allowfullscreen + @click.stop + /> + <iframe + v-else-if="tweetId && tweetExpanded" + ref="tweet" + scrolling="no" + frameborder="no" + :style="{ + position: 'relative', + width: '100%', + height: `${tweetHeight}px`, + }" + :src="`https://platform.twitter.com/embed/index.html?embedId=${embedId}&hideCard=false&hideThread=false&lang=en&theme=${ + defaultStore.state.darkMode ? 'dark' : 'light' + }&id=${tweetId}`" + @click.stop + ></iframe> + </article> + </transition> </template> <script lang="ts" setup> import { onMounted, onUnmounted } from "vue"; import { url as local, lang } from "@/config"; import { i18n } from "@/i18n"; -import MkButton from "@/components/MkButton.vue"; +import { defaultStore } from "@/store"; const props = withDefaults( defineProps<{ url: string; detail?: boolean; - compact?: boolean; }>(), { detail: false, - compact: false, } ); @@ -194,201 +189,119 @@ onUnmounted(() => { </script> <style lang="scss" scoped> -.player { - position: relative; - width: 100%; - - > button { - position: absolute; - top: -1.5em; - right: 0; - font-size: 1em; - width: 1.5em; - height: 1.5em; - padding: 0; - margin: 0; - color: var(--fg); - background: rgba(128, 128, 128, 0.2); - opacity: 0.7; - - &:hover { - opacity: 0.9; - } - } - - > iframe { - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 100%; - } -} - -.mk-url-preview { - > .expand-tweet { - margin-top: 0.5rem; - } - - &.max-width_400px { - > .link { - font-size: 12px; - - > .thumbnail { - height: 80px; - } - - > article { - padding: 12px; - } - } - } - - &.max-width_350px { - > .link { - font-size: 10px; - - > .thumbnail { - height: 70px; - } - - > article { - padding: 8px; - - > header { - margin-bottom: 4px; - } - - > footer { - margin-top: 4px; - - > img { - width: 12px; - height: 12px; - } - } - } - - &.compact { - > .thumbnail { - position: absolute; - width: 56px; - height: 100%; - } - - > article { - left: 56px; - width: calc(100% - 56px); - padding: 4px; - - > header { - margin-bottom: 2px; - } - - > footer { - margin-top: 2px; - } - } - } - } - } - - > .link { - position: relative; - display: block; - font-size: 14px; - border: 1px solid var(--divider); - border-radius: 8px; - overflow: hidden; +.url-preview { + border: 1px solid var(--divider); + border-radius: var(--radius); + overflow: hidden; + > a { + display: flex; transition: background 0.2s; - &:hover, - &:focus-within { - text-decoration: none; - background-color: var(--panelHighlight); - > article > header > h1 { - text-decoration: underline; - } - } - - > .thumbnail { - position: absolute; - width: 100px; - height: 100%; - background-position: center; - background-size: cover; + > div:first-child:not(:last-child) { + position: relative; + width: 90px; + overflow: hidden; display: flex; justify-content: center; align-items: center; - - > button { - font-size: 3.5em; - opacity: 0.7; - - &:hover { - font-size: 4em; - opacity: 0.9; - } + img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + transition: opacity 0.2s; } - - & + article { - left: 100px; - width: calc(100% - 100px); + button { + display: flex; + width: 100%; + height: 100%; + i { + background: var(--bg); + padding: 14px; + border-radius: var(--radius); + transform: scale(0.95); + opacity: 0.8; + transition: transform 0.2s, opacity 0.2s, background 0.2s; + } + &:hover, + &:focus { + i { + background: var(--panelHighlight) !important; + transform: scale(1.1) !important; + } + } } } - - > article { - position: relative; - box-sizing: border-box; - padding: 16px; - - > header { - margin-bottom: 8px; - - > h1 { - margin: 0; - font-size: 1em; - } - } - - > p { - margin: 0; + > div:last-child { + padding: 14px 16px; + width: 0; + flex-grow: 1; + } + h1, + p { + display: block; + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + } + h1 { + font-size: 1em; + white-space: nowrap; + margin-bottom: 0.2em; + } + p { + margin-bottom: -0.5em; + > span { + display: -webkit-inline-box; font-size: 0.8em; - } - - > footer { - margin-top: 8px; - height: 16px; - - > img { - display: inline-block; - width: 16px; - height: 16px; - margin-right: 4px; - vertical-align: top; - } - - > p { - display: inline-block; - margin: 0; - color: var(--urlPreviewInfo); - font-size: 0.8em; - line-height: 16px; - vertical-align: top; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + > span { + font-weight: 600; + margin-right: 0.4em; } } } - - &.compact { - > article { - > header h1, - p, - footer { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; + .icon { + width: 1.2em; + height: 1.2em; + vertical-align: middle; + border-radius: 4px; + } + &:hover, + &:focus, + &:focus-within { + background: var(--panelHighlight); + h1 { + text-decoration: underline; + } + } + } + &:hover, + &:focus-within { + > .hasButton { + > div:first-child { + img { + opacity: 0.2; + } + button i { + transform: none; + opacity: 1; } } } } + iframe { + border-top: 1px solid var(--divider); + display: block; + width: 100%; + overflow-y: auto; + &:not([src^="https://platform.twitter"]) + { + max-height: 70vh; + } + } } </style> diff --git a/packages/client/src/components/MkUserInfo.vue b/packages/client/src/components/MkUserInfo.vue index 2207363ee7..9c2763e533 100644 --- a/packages/client/src/components/MkUserInfo.vue +++ b/packages/client/src/components/MkUserInfo.vue @@ -45,12 +45,9 @@ <MkNumber :value="user.followersCount" /> </div> </div> - <MkFollowButton - v-if="$i && user.id != $i.id" - class="koudoku-button" - :user="user" - full - /> + <div class="koudoku-button"> + <MkFollowButton v-if="$i && user.id != $i.id" :user="user" /> + </div> </div> </template> diff --git a/packages/client/src/components/MkUserPreview.vue b/packages/client/src/components/MkUserPreview.vue index 77f0f4ad68..bea0268615 100644 --- a/packages/client/src/components/MkUserPreview.vue +++ b/packages/client/src/components/MkUserPreview.vue @@ -42,7 +42,7 @@ /> <div class="title"> <MkA class="name" :to="userPage(user)" - ><MkUserName :user="user" :nowrap="false" + ><MkUserName :user="user" :nowrap="true" /></MkA> <p class="username"><MkAcct :user="user" /></p> </div> @@ -241,7 +241,7 @@ onMounted(() => { > .avatar { display: block; position: absolute; - top: 62px; + top: 70px; left: 13px; z-index: 2; width: 58px; @@ -388,6 +388,7 @@ onMounted(() => { top: 8px; right: 8px; z-index: 3; + color: white; } } } diff --git a/packages/client/src/components/MkUserSelectLocalDialog.vue b/packages/client/src/components/MkUserSelectLocalDialog.vue new file mode 100644 index 0000000000..e74a63da27 --- /dev/null +++ b/packages/client/src/components/MkUserSelectLocalDialog.vue @@ -0,0 +1,223 @@ +<template> + <XModalWindow + ref="dialogEl" + :with-ok-button="true" + :ok-button-disabled="selected == null" + @click="cancel()" + @close="cancel()" + @ok="ok()" + @closed="$emit('closed')" + > + <template #header>{{ i18n.ts.selectUser }}</template> + <div class="tbhwbxdg"> + <div class="form"> + <FormSplit :min-width="170"> + <MkInput + v-model="username" + :autofocus="true" + @update:modelValue="search" + > + <template #label>{{ i18n.ts.username }}</template> + <template #prefix>@</template> + </MkInput> + </FormSplit> + </div> + <div + v-if="username != '' || host != ''" + class="result" + :class="{ hit: users.length > 0 }" + > + <div v-if="users.length > 0" class="users"> + <div + v-for="user in users" + :key="user.id" + class="user" + :class="{ + selected: selected && selected.id === user.id, + }" + @click="selected = user" + @dblclick="ok()" + > + <MkAvatar + :user="user" + class="avatar" + :show-indicator="true" + disableLink + /> + <div class="body"> + <MkUserName :user="user" class="name" /> + <MkAcct :user="user" class="acct" /> + </div> + </div> + </div> + <div v-else class="empty"> + <span>{{ i18n.ts.noUsers }}</span> + </div> + </div> + <div v-if="username == '' && host == ''" class="recent"> + <div class="users"> + <div + v-for="user in recentUsers" + :key="user.id" + class="user" + :class="{ + selected: selected && selected.id === user.id, + }" + @click="selected = user" + @dblclick="ok()" + > + <MkAvatar + :user="user" + class="avatar" + :show-indicator="true" + disableLink + /> + <div class="body"> + <MkUserName :user="user" class="name" /> + <MkAcct :user="user" class="acct" /> + </div> + </div> + </div> + </div> + </div> + </XModalWindow> +</template> + +<script lang="ts" setup> +import { nextTick, onMounted } from "vue"; +import * as misskey from "calckey-js"; +import MkInput from "@/components/form/input.vue"; +import FormSplit from "@/components/form/split.vue"; +import XModalWindow from "@/components/MkModalWindow.vue"; +import * as os from "@/os"; +import { defaultStore } from "@/store"; +import { i18n } from "@/i18n"; + +const emit = defineEmits<{ + (ev: "ok", selected: misskey.entities.UserDetailed): void; + (ev: "cancel"): void; + (ev: "closed"): void; +}>(); + +let username = $ref(""); +let host = $ref(""); +let users: misskey.entities.UserDetailed[] = $ref([]); +let recentUsers: misskey.entities.UserDetailed[] = $ref([]); +let selected: misskey.entities.UserDetailed | null = $ref(null); +let dialogEl = $ref(); + +const search = () => { + if (username === "" && host === "") { + users = []; + return; + } + os.api("users/search-by-username-and-host", { + username: username, + host: null, + limit: 10, + detail: false, + }).then((_users) => { + users = _users; + }); +}; + +const ok = () => { + if (selected == null) return; + emit("ok", selected); + dialogEl.close(); + + // 最近使ったユーザー更新 + let recents = defaultStore.state.recentlyUsedUsers; + recents = recents.filter((x) => x !== selected.id); + recents.unshift(selected.id); + defaultStore.set("recentlyUsedUsers", recents.splice(0, 16)); +}; + +const cancel = () => { + emit("cancel"); + dialogEl.close(); +}; + +onMounted(() => { + os.api("users/show", { + userIds: defaultStore.state.recentlyUsedUsers, + }).then((users) => { + recentUsers = users; + }); +}); +</script> + +<style lang="scss" scoped> +.tbhwbxdg { + > .form { + padding: 0 var(--root-margin); + } + + > .result, + > .recent { + display: flex; + flex-direction: column; + overflow: auto; + height: 100%; + + &.result.hit { + padding: 0; + } + + &.recent { + padding: 0; + } + + > .users { + flex: 1; + overflow: auto; + padding: 8px 0; + + > .user { + display: flex; + align-items: center; + padding: 8px var(--root-margin); + font-size: 14px; + + &:hover { + background: var(--X7); + } + + &.selected { + background: var(--accent); + color: #fff; + } + + > * { + pointer-events: none; + user-select: none; + } + + > .avatar { + width: 45px; + height: 45px; + } + + > .body { + padding: 0 8px; + min-width: 0; + + > .name { + display: block; + font-weight: bold; + } + + > .acct { + opacity: 0.5; + } + } + } + } + + > .empty { + opacity: 0.7; + text-align: center; + } + } +} +</style> diff --git a/packages/client/src/components/MkVisibilityPicker.vue b/packages/client/src/components/MkVisibilityPicker.vue index f4529faa52..ce51f851e4 100644 --- a/packages/client/src/components/MkVisibilityPicker.vue +++ b/packages/client/src/components/MkVisibilityPicker.vue @@ -215,7 +215,6 @@ function choose(visibility: (typeof misskey.noteVisibilities)[number]): void { .body { flex: 1 1 auto; - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } @@ -227,6 +226,8 @@ function choose(visibility: (typeof misskey.noteVisibilities)[number]): void { .itemDescription { opacity: 0.6; + display: block; + line-height: 1.5; } .toggle { diff --git a/packages/client/src/components/MkWidgets.vue b/packages/client/src/components/MkWidgets.vue index d48fc53832..0d64c9fb62 100644 --- a/packages/client/src/components/MkWidgets.vue +++ b/packages/client/src/components/MkWidgets.vue @@ -172,6 +172,9 @@ function onContextmenu(widget: Widget, ev: MouseEvent) { <style lang="scss" scoped> .vjoppmmu { + display: flex; + flex-direction: column; + flex-grow: 1; > header { margin: 16px 0; @@ -184,7 +187,7 @@ function onContextmenu(widget: Widget, ev: MouseEvent) { > .widget, .customize-container { contain: content; - margin: var(--margin) 0; + margin-bottom: var(--margin); &:first-of-type { margin-top: 0; diff --git a/packages/client/src/components/global/MkPageHeader.vue b/packages/client/src/components/global/MkPageHeader.vue index 08c27bcf76..c1ee84f4df 100644 --- a/packages/client/src/components/global/MkPageHeader.vue +++ b/packages/client/src/components/global/MkPageHeader.vue @@ -33,7 +33,7 @@ @click="showTabsPopup" > <MkAvatar - v-if="metadata.avatar" + v-if="metadata && metadata.avatar" class="avatar" :user="metadata.avatar" :show-indicator="true" @@ -91,7 +91,7 @@ </nav> </template> <div class="buttons right"> - <template v-if="metadata.avatar"> + <template v-if="metadata && metadata.avatar"> <MkFollowButton v-if="narrow" :user="metadata.avatar" @@ -307,6 +307,8 @@ onUnmounted(() => { padding-inline: 24px; box-sizing: border-box; overflow: hidden; + -webkit-backdrop-filter: var(--blur, blur(15px)); + backdrop-filter: var(--blur, blur(15px)); @media (max-width: 500px) { padding-inline: 16px; &.tabs > .buttons > :deep(.follow-button > span) { @@ -345,8 +347,6 @@ onUnmounted(() => { position: absolute; inset: 0; border-bottom: solid 0.5px var(--divider); - -webkit-backdrop-filter: var(--blur, blur(15px)); - backdrop-filter: var(--blur, blur(15px)); z-index: -1; } &::after { diff --git a/packages/client/src/components/global/MkTime.vue b/packages/client/src/components/global/MkTime.vue index db53248bb4..72a51f10d6 100644 --- a/packages/client/src/components/global/MkTime.vue +++ b/packages/client/src/components/global/MkTime.vue @@ -1,22 +1,24 @@ <template> <time :title="absolute"> - <template v-if="mode === 'relative'">{{ relative }}</template> + <template v-if="invalid">{{ i18n.ts._ago.invalid }}</template> + <template v-else-if="mode === 'relative'">{{ relative }}</template> <template v-else-if="mode === 'absolute'">{{ absolute }}</template> <template v-else-if="mode === 'detail'" >{{ absolute }} ({{ relative }})</template > - <slot></slot> </time> </template> <script lang="ts" setup> -import { onUnmounted } from "vue"; +import { onMounted, onUnmounted } from "vue"; import { i18n } from "@/i18n"; +import { dateTimeFormat } from "@/scripts/intl-const"; const props = withDefaults( defineProps<{ - time: Date | string; - mode?: "relative" | "absolute" | "detail" | "none"; + time: Date | string | number | null; + origin?: Date | null; + mode?: "relative" | "absolute" | "detail"; }>(), { mode: "relative", @@ -24,12 +26,23 @@ const props = withDefaults( ); const _time = - typeof props.time === "string" ? new Date(props.time) : props.time; -const absolute = _time.toLocaleString(); + props.time == null + ? NaN + : typeof props.time === "number" + ? props.time + : (props.time instanceof Date + ? props.time + : new Date(props.time) + ).getTime(); +const invalid = Number.isNaN(_time); +const absolute = !invalid ? dateTimeFormat.format(_time) : i18n.ts._ago.invalid; -let now = $shallowRef(new Date()); -const relative = $computed(() => { - const ago = (now.getTime() - _time.getTime()) / 1000; /*ms*/ +let now = $ref((props.origin ?? new Date()).getTime()); +const relative = $computed<string>(() => { + if (props.mode === "absolute") return ""; // absoluteではrelativeを使わないので計算しない + if (invalid) return i18n.ts._ago.invalid; + + const ago = (now - _time) / 1000; /*ms*/ return ago >= 31536000 ? i18n.t("_ago.yearsAgo", { n: Math.round(ago / 31536000).toString() }) : ago >= 2592000 @@ -49,22 +62,36 @@ const relative = $computed(() => { : i18n.ts._ago.future; }); -function tick() { - // TODO: パフォーマンス向上のため、このコンポーネントが画面内に表示されている場合のみ更新する - now = new Date(); - - tickId = window.setTimeout(() => { - window.requestAnimationFrame(tick); - }, 10000); -} - let tickId: number; -if (props.mode === "relative" || props.mode === "detail") { - tickId = window.requestAnimationFrame(tick); +function tick() { + const _now = new Date().getTime(); + const agoPrev = (now - _time) / 1000; /*ms*/ // 現状のinterval + now = _now; + + const ago = (now - _time) / 1000; /*ms*/ // 次のinterval + const prev = agoPrev < 60 ? 10000 : agoPrev < 3600 ? 60000 : 180000; + const next = ago < 60 ? 10000 : ago < 3600 ? 60000 : 180000; + + if (!tickId) { + tickId = window.setInterval(tick, next); + } else if (prev < next) { + window.clearInterval(tickId); + tickId = window.setInterval(tick, next); + } +} + +if ( + !invalid && + props.origin === null && + (props.mode === "relative" || props.mode === "detail") +) { + onMounted(() => { + tick(); + }); onUnmounted(() => { - window.cancelAnimationFrame(tickId); + if (tickId) window.clearInterval(tickId); }); } </script> diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 5282bffdef..cb0942a338 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -65,7 +65,7 @@ export default defineComponent({ }; // const validEase = (e: string | null | undefined) => { // if (e == null) return null; - // return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) + // return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) // ? (e.startsWith("steps") ? e : "cubic-bezier" + e) // : null // } @@ -110,7 +110,7 @@ export default defineComponent({ case "fn": { // TODO: CSSを文字列で組み立てていくと token.props.args.~~~ 経由でCSSインジェクションできるのでよしなにやる - let style; + let style: string; switch (token.props.name) { case "tada": { const speed = validTime(token.props.args.speed) || "1s"; @@ -300,6 +300,24 @@ export default defineComponent({ style = `background-color: #${color};`; break; } + case "small": { + return h( + "small", + { + style: "opacity: 0.7;", + }, + genEl(token.children), + ); + } + case "center": { + return h( + "div", + { + style: "text-align: center;", + }, + genEl(token.children), + ); + } } if (style == null) { return h("span", {}, [ @@ -337,7 +355,7 @@ export default defineComponent({ h( "div", { - style: "text-align:center;", + style: "text-align: center;", }, genEl(token.children), ), diff --git a/packages/client/src/directives/tooltip.ts b/packages/client/src/directives/tooltip.ts index 9dabd0756b..e2db3fbf57 100644 --- a/packages/client/src/directives/tooltip.ts +++ b/packages/client/src/directives/tooltip.ts @@ -4,6 +4,7 @@ import { defineAsyncComponent, Directive, ref } from "vue"; import { isTouchUsing } from "@/scripts/touch"; import { popup, alert } from "@/os"; +import { mainRouter } from "@/router"; const start = isTouchUsing ? "touchstart" : "mouseover"; const end = isTouchUsing ? "touchend" : "mouseleave"; @@ -99,6 +100,8 @@ export default { el.addEventListener(end, hideTooltip, { passive: true }); el.addEventListener("focusout", hideTooltip, { passive: true }); + mainRouter.on("change", hideTooltip); + el.addEventListener("click", () => { window.clearTimeout(self.showTimer); self.close(); diff --git a/packages/client/src/emojilist.json b/packages/client/src/emojilist.json deleted file mode 100644 index 37a9765a5f..0000000000 --- a/packages/client/src/emojilist.json +++ /dev/null @@ -1,1785 +0,0 @@ -[ - { "category": "face", "char": "😀", "name": "grinning", "keywords": ["face", "smile", "happy", "joy", ": D", "grin"] }, - { "category": "face", "char": "😬", "name": "grimacing", "keywords": ["face", "grimace", "teeth"] }, - { "category": "face", "char": "😁", "name": "grin", "keywords": ["face", "happy", "smile", "joy", "kawaii"] }, - { "category": "face", "char": "😂", "name": "joy", "keywords": ["face", "cry", "tears", "weep", "happy", "happytears", "haha"] }, - { "category": "face", "char": "🤣", "name": "rofl", "keywords": ["face", "rolling", "floor", "laughing", "lol", "haha"] }, - { "category": "face", "char": "🥳", "name": "partying", "keywords": ["face", "celebration", "woohoo"] }, - { "category": "face", "char": "😃", "name": "smiley", "keywords": ["face", "happy", "joy", "haha", ": D", ": )", "smile", "funny"] }, - { "category": "face", "char": "😄", "name": "smile", "keywords": ["face", "happy", "joy", "funny", "haha", "laugh", "like", ": D", ": )"] }, - { "category": "face", "char": "😅", "name": "sweat_smile", "keywords": ["face", "hot", "happy", "laugh", "sweat", "smile", "relief"] }, - { "category": "face", "char": "🥲", "name": "smiling_face_with_tear", "keywords": ["face"] }, - { "category": "face", "char": "😆", "name": "laughing", "keywords": ["happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh"] }, - { "category": "face", "char": "😇", "name": "innocent", "keywords": ["face", "angel", "heaven", "halo"] }, - { "category": "face", "char": "😉", "name": "wink", "keywords": ["face", "happy", "mischievous", "secret", ";)", "smile", "eye"] }, - { "category": "face", "char": "😊", "name": "blush", "keywords": ["face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy"] }, - { "category": "face", "char": "🙂", "name": "slightly_smiling_face", "keywords": ["face", "smile"] }, - { "category": "face", "char": "🙃", "name": "upside_down_face", "keywords": ["face", "flipped", "silly", "smile"] }, - { "category": "face", "char": "☺️", "name": "relaxed", "keywords": ["face", "blush", "massage", "happiness"] }, - { "category": "face", "char": "😋", "name": "yum", "keywords": ["happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring"] }, - { "category": "face", "char": "😌", "name": "relieved", "keywords": ["face", "relaxed", "phew", "massage", "happiness"] }, - { "category": "face", "char": "😍", "name": "heart_eyes", "keywords": ["face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart"] }, - { "category": "face", "char": "🥰", "name": "smiling_face_with_three_hearts", "keywords": ["face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore"] }, - { "category": "face", "char": "😘", "name": "kissing_heart", "keywords": ["face", "love", "like", "affection", "valentines", "infatuation", "kiss"] }, - { "category": "face", "char": "😗", "name": "kissing", "keywords": ["love", "like", "face", "3", "valentines", "infatuation", "kiss"] }, - { "category": "face", "char": "😙", "name": "kissing_smiling_eyes", "keywords": ["face", "affection", "valentines", "infatuation", "kiss"] }, - { "category": "face", "char": "😚", "name": "kissing_closed_eyes", "keywords": ["face", "love", "like", "affection", "valentines", "infatuation", "kiss"] }, - { "category": "face", "char": "😜", "name": "stuck_out_tongue_winking_eye", "keywords": ["face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue"] }, - { "category": "face", "char": "🤪", "name": "zany", "keywords": ["face", "goofy", "crazy"] }, - { "category": "face", "char": "🤨", "name": "raised_eyebrow", "keywords": ["face", "distrust", "scepticism", "disapproval", "disbelief", "surprise"] }, - { "category": "face", "char": "🧐", "name": "monocle", "keywords": ["face", "stuffy", "wealthy"] }, - { "category": "face", "char": "😝", "name": "stuck_out_tongue_closed_eyes", "keywords": ["face", "prank", "playful", "mischievous", "smile", "tongue"] }, - { "category": "face", "char": "😛", "name": "stuck_out_tongue", "keywords": ["face", "prank", "childish", "playful", "mischievous", "smile", "tongue"] }, - { "category": "face", "char": "🤑", "name": "money_mouth_face", "keywords": ["face", "rich", "dollar", "money"] }, - { "category": "face", "char": "🤓", "name": "nerd_face", "keywords": ["face", "nerdy", "geek", "dork"] }, - { "category": "face", "char": "🥸", "name": "disguised_face", "keywords": ["face", "nose", "glasses", "incognito"] }, - { "category": "face", "char": "😎", "name": "sunglasses", "keywords": ["face", "cool", "smile", "summer", "beach", "sunglass"] }, - { "category": "face", "char": "🤩", "name": "star_struck", "keywords": ["face", "smile", "starry", "eyes", "grinning"] }, - { "category": "face", "char": "🤡", "name": "clown_face", "keywords": ["face"] }, - { "category": "face", "char": "🤠", "name": "cowboy_hat_face", "keywords": ["face", "cowgirl", "hat"] }, - { "category": "face", "char": "🤗", "name": "hugs", "keywords": ["face", "smile", "hug"] }, - { "category": "face", "char": "😏", "name": "smirk", "keywords": ["face", "smile", "mean", "prank", "smug", "sarcasm"] }, - { "category": "face", "char": "😶", "name": "no_mouth", "keywords": ["face", "hellokitty"] }, - { "category": "face", "char": "😐", "name": "neutral_face", "keywords": ["indifference", "meh", ": |", "neutral"] }, - { "category": "face", "char": "😑", "name": "expressionless", "keywords": ["face", "indifferent", "-_-", "meh", "deadpan"] }, - { "category": "face", "char": "😒", "name": "unamused", "keywords": ["indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye"] }, - { "category": "face", "char": "🙄", "name": "roll_eyes", "keywords": ["face", "eyeroll", "frustrated"] }, - { "category": "face", "char": "🤔", "name": "thinking", "keywords": ["face", "hmmm", "think", "consider"] }, - { "category": "face", "char": "🤥", "name": "lying_face", "keywords": ["face", "lie", "pinocchio"] }, - { "category": "face", "char": "🤭", "name": "hand_over_mouth", "keywords": ["face", "whoops", "shock", "surprise"] }, - { "category": "face", "char": "🤫", "name": "shushing", "keywords": ["face", "quiet", "shhh"] }, - { "category": "face", "char": "🤬", "name": "symbols_over_mouth", "keywords": ["face", "swearing", "cursing", "cussing", "profanity", "expletive"] }, - { "category": "face", "char": "🤯", "name": "exploding_head", "keywords": ["face", "shocked", "mind", "blown"] }, - { "category": "face", "char": "😳", "name": "flushed", "keywords": ["face", "blush", "shy", "flattered"] }, - { "category": "face", "char": "😞", "name": "disappointed", "keywords": ["face", "sad", "upset", "depressed", ": ("] }, - { "category": "face", "char": "😟", "name": "worried", "keywords": ["face", "concern", "nervous", ": ("] }, - { "category": "face", "char": "😠", "name": "angry", "keywords": ["mad", "face", "annoyed", "frustrated"] }, - { "category": "face", "char": "😡", "name": "rage", "keywords": ["angry", "mad", "hate", "despise"] }, - { "category": "face", "char": "😔", "name": "pensive", "keywords": ["face", "sad", "depressed", "upset"] }, - { "category": "face", "char": "😕", "name": "confused", "keywords": ["face", "indifference", "huh", "weird", "hmmm", ": /"] }, - { "category": "face", "char": "🙁", "name": "slightly_frowning_face", "keywords": ["face", "frowning", "disappointed", "sad", "upset"] }, - { "category": "face", "char": "☹", "name": "frowning_face", "keywords": ["face", "sad", "upset", "frown"] }, - { "category": "face", "char": "😣", "name": "persevere", "keywords": ["face", "sick", "no", "upset", "oops"] }, - { "category": "face", "char": "😖", "name": "confounded", "keywords": ["face", "confused", "sick", "unwell", "oops", ": S"] }, - { "category": "face", "char": "😫", "name": "tired_face", "keywords": ["sick", "whine", "upset", "frustrated"] }, - { "category": "face", "char": "😩", "name": "weary", "keywords": ["face", "tired", "sleepy", "sad", "frustrated", "upset"] }, - { "category": "face", "char": "🥺", "name": "pleading", "keywords": ["face", "begging", "mercy"] }, - { "category": "face", "char": "😤", "name": "triumph", "keywords": ["face", "gas", "phew", "proud", "pride"] }, - { "category": "face", "char": "😮", "name": "open_mouth", "keywords": ["face", "surprise", "impressed", "wow", "whoa", ": O"] }, - { "category": "face", "char": "😱", "name": "scream", "keywords": ["face", "munch", "scared", "omg"] }, - { "category": "face", "char": "😨", "name": "fearful", "keywords": ["face", "scared", "terrified", "nervous", "oops", "huh"] }, - { "category": "face", "char": "😰", "name": "cold_sweat", "keywords": ["face", "nervous", "sweat"] }, - { "category": "face", "char": "😯", "name": "hushed", "keywords": ["face", "woo", "shh"] }, - { "category": "face", "char": "😦", "name": "frowning", "keywords": ["face", "aw", "what"] }, - { "category": "face", "char": "😧", "name": "anguished", "keywords": ["face", "stunned", "nervous"] }, - { "category": "face", "char": "😢", "name": "cry", "keywords": ["face", "tears", "sad", "depressed", "upset", ": '("] }, - { "category": "face", "char": "😥", "name": "disappointed_relieved", "keywords": ["face", "phew", "sweat", "nervous"] }, - { "category": "face", "char": "🤤", "name": "drooling_face", "keywords": ["face"] }, - { "category": "face", "char": "😪", "name": "sleepy", "keywords": ["face", "tired", "rest", "nap"] }, - { "category": "face", "char": "😓", "name": "sweat", "keywords": ["face", "hot", "sad", "tired", "exercise"] }, - { "category": "face", "char": "🥵", "name": "hot", "keywords": ["face", "feverish", "heat", "red", "sweating"] }, - { "category": "face", "char": "🥶", "name": "cold", "keywords": ["face", "blue", "freezing", "frozen", "frostbite", "icicles"] }, - { "category": "face", "char": "😭", "name": "sob", "keywords": ["face", "cry", "tears", "sad", "upset", "depressed"] }, - { "category": "face", "char": "😵", "name": "dizzy_face", "keywords": ["spent", "unconscious", "xox", "dizzy"] }, - { "category": "face", "char": "😲", "name": "astonished", "keywords": ["face", "xox", "surprised", "poisoned"] }, - { "category": "face", "char": "🤐", "name": "zipper_mouth_face", "keywords": ["face", "sealed", "zipper", "secret"] }, - { "category": "face", "char": "🤢", "name": "nauseated_face", "keywords": ["face", "vomit", "gross", "green", "sick", "throw up", "ill"] }, - { "category": "face", "char": "🤧", "name": "sneezing_face", "keywords": ["face", "gesundheit", "sneeze", "sick", "allergy"] }, - { "category": "face", "char": "🤮", "name": "vomiting", "keywords": ["face", "sick"] }, - { "category": "face", "char": "😷", "name": "mask", "keywords": ["face", "sick", "ill", "disease"] }, - { "category": "face", "char": "🤒", "name": "face_with_thermometer", "keywords": ["sick", "temperature", "thermometer", "cold", "fever"] }, - { "category": "face", "char": "🤕", "name": "face_with_head_bandage", "keywords": ["injured", "clumsy", "bandage", "hurt"] }, - { "category": "face", "char": "🥴", "name": "woozy", "keywords": ["face", "dizzy", "intoxicated", "tipsy", "wavy"] }, - { "category": "face", "char": "🥱", "name": "yawning", "keywords": ["face", "tired", "yawning"] }, - { "category": "face", "char": "😴", "name": "sleeping", "keywords": ["face", "tired", "sleepy", "night", "zzz"] }, - { "category": "face", "char": "💤", "name": "zzz", "keywords": ["sleepy", "tired", "dream"] }, - { "category": "face", "char": "\uD83D\uDE36\u200D\uD83C\uDF2B\uFE0F", "name": "face_in_clouds", "keywords": [] }, - { "category": "face", "char": "\uD83D\uDE2E\u200D\uD83D\uDCA8", "name": "face_exhaling", "keywords": [] }, - { "category": "face", "char": "\uD83D\uDE35\u200D\uD83D\uDCAB", "name": "face_with_spiral_eyes", "keywords": [] }, - { "category": "face", "char": "\uD83E\uDEE0", "name": "melting_face", "keywords": ["disappear", "dissolve", "liquid", "melt", "toketa"] }, - { "category": "face", "char": "\uD83E\uDEE2", "name": "face_with_open_eyes_and_hand_over_mouth", "keywords": ["amazement", "awe", "disbelief", "embarrass", "scared", "surprise", "ohoho"] }, - { "category": "face", "char": "\uD83E\uDEE3", "name": "face_with_peeking_eye", "keywords": ["captivated", "peep", "stare", "chunibyo"] }, - { "category": "face", "char": "\uD83E\uDEE1", "name": "saluting_face", "keywords": ["ok", "salute", "sunny", "troops", "yes", "raja"] }, - { "category": "face", "char": "\uD83E\uDEE5", "name": "dotted_line_face", "keywords": ["depressed", "disappear", "hide", "introvert", "invisible", "tensen"] }, - { "category": "face", "char": "\uD83E\uDEE4", "name": "face_with_diagonal_mouth", "keywords": ["disappointed", "meh", "skeptical", "unsure"] }, - { "category": "face", "char": "\uD83E\uDD79", "name": "face_holding_back_tears", "keywords": ["angry", "cry", "proud", "resist", "sad"] }, - { "category": "face", "char": "💩", "name": "poop", "keywords": ["hankey", "shitface", "fail", "turd", "shit"] }, - { "category": "face", "char": "😈", "name": "smiling_imp", "keywords": ["devil", "horns"] }, - { "category": "face", "char": "👿", "name": "imp", "keywords": ["devil", "angry", "horns"] }, - { "category": "face", "char": "👹", "name": "japanese_ogre", "keywords": ["monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre"] }, - { "category": "face", "char": "👺", "name": "japanese_goblin", "keywords": ["red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin"] }, - { "category": "face", "char": "💀", "name": "skull", "keywords": ["dead", "skeleton", "creepy", "death"] }, - { "category": "face", "char": "👻", "name": "ghost", "keywords": ["halloween", "spooky", "scary"] }, - { "category": "face", "char": "👽", "name": "alien", "keywords": ["UFO", "paul", "weird", "outer_space"] }, - { "category": "face", "char": "🤖", "name": "robot", "keywords": ["computer", "machine", "bot"] }, - { "category": "face", "char": "😺", "name": "smiley_cat", "keywords": ["animal", "cats", "happy", "smile"] }, - { "category": "face", "char": "😸", "name": "smile_cat", "keywords": ["animal", "cats", "smile"] }, - { "category": "face", "char": "😹", "name": "joy_cat", "keywords": ["animal", "cats", "haha", "happy", "tears"] }, - { "category": "face", "char": "😻", "name": "heart_eyes_cat", "keywords": ["animal", "love", "like", "affection", "cats", "valentines", "heart"] }, - { "category": "face", "char": "😼", "name": "smirk_cat", "keywords": ["animal", "cats", "smirk"] }, - { "category": "face", "char": "😽", "name": "kissing_cat", "keywords": ["animal", "cats", "kiss"] }, - { "category": "face", "char": "🙀", "name": "scream_cat", "keywords": ["animal", "cats", "munch", "scared", "scream"] }, - { "category": "face", "char": "😿", "name": "crying_cat_face", "keywords": ["animal", "tears", "weep", "sad", "cats", "upset", "cry"] }, - { "category": "face", "char": "😾", "name": "pouting_cat", "keywords": ["animal", "cats"] }, - { "category": "people", "char": "🤲", "name": "palms_up", "keywords": ["hands", "gesture", "cupped", "prayer"] }, - { "category": "people", "char": "🙌", "name": "raised_hands", "keywords": ["gesture", "hooray", "yea", "celebration", "hands"] }, - { "category": "people", "char": "👏", "name": "clap", "keywords": ["hands", "praise", "applause", "congrats", "yay"] }, - { "category": "people", "char": "👋", "name": "wave", "keywords": ["hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm"] }, - { "category": "people", "char": "🤙", "name": "call_me_hand", "keywords": ["hands", "gesture"] }, - { "category": "people", "char": "👍", "name": "+1", "keywords": ["thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like"] }, - { "category": "people", "char": "👎", "name": "-1", "keywords": ["thumbsdown", "no", "dislike", "hand"] }, - { "category": "people", "char": "👊", "name": "facepunch", "keywords": ["angry", "violence", "fist", "hit", "attack", "hand"] }, - { "category": "people", "char": "✊", "name": "fist", "keywords": ["fingers", "hand", "grasp"] }, - { "category": "people", "char": "🤛", "name": "fist_left", "keywords": ["hand", "fistbump"] }, - { "category": "people", "char": "🤜", "name": "fist_right", "keywords": ["hand", "fistbump"] }, - { "category": "people", "char": "✌", "name": "v", "keywords": ["fingers", "ohyeah", "hand", "peace", "victory", "two"] }, - { "category": "people", "char": "👌", "name": "ok_hand", "keywords": ["fingers", "limbs", "perfect", "ok", "okay"] }, - { "category": "people", "char": "✋", "name": "raised_hand", "keywords": ["fingers", "stop", "highfive", "palm", "ban"] }, - { "category": "people", "char": "🤚", "name": "raised_back_of_hand", "keywords": ["fingers", "raised", "backhand"] }, - { "category": "people", "char": "👐", "name": "open_hands", "keywords": ["fingers", "butterfly", "hands", "open"] }, - { "category": "people", "char": "💪", "name": "muscle", "keywords": ["arm", "flex", "hand", "summer", "strong", "biceps"] }, - { "category": "people", "char": "🦾", "name": "mechanical_arm", "keywords": ["flex", "hand", "strong", "biceps"] }, - { "category": "people", "char": "🙏", "name": "pray", "keywords": ["please", "hope", "wish", "namaste", "highfive"] }, - { "category": "people", "char": "🦶", "name": "foot", "keywords": ["kick", "stomp"] }, - { "category": "people", "char": "🦵", "name": "leg", "keywords": ["kick", "limb"] }, - { "category": "people", "char": "🦿", "name": "mechanical_leg", "keywords": ["kick", "limb"] }, - { "category": "people", "char": "🤝", "name": "handshake", "keywords": ["agreement", "shake"] }, - { "category": "people", "char": "☝", "name": "point_up", "keywords": ["hand", "fingers", "direction", "up"] }, - { "category": "people", "char": "👆", "name": "point_up_2", "keywords": ["fingers", "hand", "direction", "up"] }, - { "category": "people", "char": "👇", "name": "point_down", "keywords": ["fingers", "hand", "direction", "down"] }, - { "category": "people", "char": "👈", "name": "point_left", "keywords": ["direction", "fingers", "hand", "left"] }, - { "category": "people", "char": "👉", "name": "point_right", "keywords": ["fingers", "hand", "direction", "right"] }, - { "category": "people", "char": "🖕", "name": "fu", "keywords": ["hand", "fingers", "rude", "middle", "flipping"] }, - { "category": "people", "char": "🖐", "name": "raised_hand_with_fingers_splayed", "keywords": ["hand", "fingers", "palm"] }, - { "category": "people", "char": "🤟", "name": "love_you", "keywords": ["hand", "fingers", "gesture"] }, - { "category": "people", "char": "🤘", "name": "metal", "keywords": ["hand", "fingers", "evil_eye", "sign_of_horns", "rock_on"] }, - { "category": "people", "char": "🤞", "name": "crossed_fingers", "keywords": ["good", "lucky"] }, - { "category": "people", "char": "🖖", "name": "vulcan_salute", "keywords": ["hand", "fingers", "spock", "star trek"] }, - { "category": "people", "char": "✍", "name": "writing_hand", "keywords": ["lower_left_ballpoint_pen", "stationery", "write", "compose"] }, - { "category": "people", "char": "\uD83E\uDEF0", "name": "hand_with_index_finger_and_thumb_crossed", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF1", "name": "rightwards_hand", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF2", "name": "leftwards_hand", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF3", "name": "palm_down_hand", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF4", "name": "palm_up_hand", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF5", "name": "index_pointing_at_the_viewer", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEF6", "name": "heart_hands", "keywords": ["moemoekyun"] }, - { "category": "people", "char": "🤏", "name": "pinching_hand", "keywords": ["hand", "fingers"] }, - { "category": "people", "char": "🤌", "name": "pinched_fingers", "keywords": ["hand", "fingers"] }, - { "category": "people", "char": "🤳", "name": "selfie", "keywords": ["camera", "phone"] }, - { "category": "people", "char": "💅", "name": "nail_care", "keywords": ["beauty", "manicure", "finger", "fashion", "nail", "slay"] }, - { "category": "people", "char": "👄", "name": "lips", "keywords": ["mouth", "kiss"] }, - { "category": "people", "char": "\uD83E\uDEE6", "name": "biting_lip", "keywords": ["sheesh"] }, - { "category": "people", "char": "🦷", "name": "tooth", "keywords": ["teeth", "dentist"] }, - { "category": "people", "char": "👅", "name": "tongue", "keywords": ["mouth", "playful"] }, - { "category": "people", "char": "👂", "name": "ear", "keywords": ["face", "hear", "sound", "listen"] }, - { "category": "people", "char": "🦻", "name": "ear_with_hearing_aid", "keywords": ["face", "hear", "sound", "listen"] }, - { "category": "people", "char": "👃", "name": "nose", "keywords": ["smell", "sniff"] }, - { "category": "people", "char": "👁", "name": "eye", "keywords": ["face", "look", "see", "watch", "stare"] }, - { "category": "people", "char": "👀", "name": "eyes", "keywords": ["look", "watch", "stalk", "peek", "see"] }, - { "category": "people", "char": "🧠", "name": "brain", "keywords": ["smart", "intelligent"] }, - { "category": "people", "char": "🫀", "name": "anatomical_heart", "keywords": [] }, - { "category": "people", "char": "🫁", "name": "lungs", "keywords": [] }, - { "category": "people", "char": "👤", "name": "bust_in_silhouette", "keywords": ["user", "person", "human"] }, - { "category": "people", "char": "👥", "name": "busts_in_silhouette", "keywords": ["user", "person", "human", "group", "team"] }, - { "category": "people", "char": "🗣", "name": "speaking_head", "keywords": ["user", "person", "human", "sing", "say", "talk"] }, - { "category": "people", "char": "👶", "name": "baby", "keywords": ["child", "boy", "girl", "toddler"] }, - { "category": "people", "char": "🧒", "name": "child", "keywords": ["gender-neutral", "young"] }, - { "category": "people", "char": "👦", "name": "boy", "keywords": ["man", "male", "guy", "teenager"] }, - { "category": "people", "char": "👧", "name": "girl", "keywords": ["female", "woman", "teenager"] }, - { "category": "people", "char": "🧑", "name": "adult", "keywords": ["gender-neutral", "person"] }, - { "category": "people", "char": "👨", "name": "man", "keywords": ["mustache", "father", "dad", "guy", "classy", "sir", "moustache"] }, - { "category": "people", "char": "👩", "name": "woman", "keywords": ["female", "girls", "lady"] }, - { "category": "people", "char": "🧑🦱", "name": "curly_hair", "keywords": ["curly", "afro", "braids", "ringlets"] }, - { "category": "people", "char": "👩🦱", "name": "curly_hair_woman", "keywords": ["woman", "female", "girl", "curly", "afro", "braids", "ringlets"] }, - { "category": "people", "char": "👨🦱", "name": "curly_hair_man", "keywords": ["man", "male", "boy", "guy", "curly", "afro", "braids", "ringlets"] }, - { "category": "people", "char": "🧑🦰", "name": "red_hair", "keywords": ["redhead"] }, - { "category": "people", "char": "👩🦰", "name": "red_hair_woman", "keywords": ["woman", "female", "girl", "ginger", "redhead"] }, - { "category": "people", "char": "👨🦰", "name": "red_hair_man", "keywords": ["man", "male", "boy", "guy", "ginger", "redhead"] }, - { "category": "people", "char": "👱♀️", "name": "blonde_woman", "keywords": ["woman", "female", "girl", "blonde", "person"] }, - { "category": "people", "char": "👱", "name": "blonde_man", "keywords": ["man", "male", "boy", "blonde", "guy", "person"] }, - { "category": "people", "char": "🧑🦳", "name": "white_hair", "keywords": ["gray", "old", "white"] }, - { "category": "people", "char": "👩🦳", "name": "white_hair_woman", "keywords": ["woman", "female", "girl", "gray", "old", "white"] }, - { "category": "people", "char": "👨🦳", "name": "white_hair_man", "keywords": ["man", "male", "boy", "guy", "gray", "old", "white"] }, - { "category": "people", "char": "🧑🦲", "name": "bald", "keywords": ["bald", "chemotherapy", "hairless", "shaven"] }, - { "category": "people", "char": "👩🦲", "name": "bald_woman", "keywords": ["woman", "female", "girl", "bald", "chemotherapy", "hairless", "shaven"] }, - { "category": "people", "char": "👨🦲", "name": "bald_man", "keywords": ["man", "male", "boy", "guy", "bald", "chemotherapy", "hairless", "shaven"] }, - { "category": "people", "char": "🧔", "name": "bearded_person", "keywords": ["person", "bewhiskered"] }, - { "category": "people", "char": "🧓", "name": "older_adult", "keywords": ["human", "elder", "senior", "gender-neutral"] }, - { "category": "people", "char": "👴", "name": "older_man", "keywords": ["human", "male", "men", "old", "elder", "senior"] }, - { "category": "people", "char": "👵", "name": "older_woman", "keywords": ["human", "female", "women", "lady", "old", "elder", "senior"] }, - { "category": "people", "char": "👲", "name": "man_with_gua_pi_mao", "keywords": ["male", "boy", "chinese"] }, - { "category": "people", "char": "🧕", "name": "woman_with_headscarf", "keywords": ["female", "hijab", "mantilla", "tichel"] }, - { "category": "people", "char": "👳♀️", "name": "woman_with_turban", "keywords": ["female", "indian", "hinduism", "arabs", "woman"] }, - { "category": "people", "char": "👳", "name": "man_with_turban", "keywords": ["male", "indian", "hinduism", "arabs"] }, - { "category": "people", "char": "👮♀️", "name": "policewoman", "keywords": ["woman", "police", "law", "legal", "enforcement", "arrest", "911", "female"] }, - { "category": "people", "char": "👮", "name": "policeman", "keywords": ["man", "police", "law", "legal", "enforcement", "arrest", "911"] }, - { "category": "people", "char": "👷♀️", "name": "construction_worker_woman", "keywords": ["female", "human", "wip", "build", "construction", "worker", "labor", "woman"] }, - { "category": "people", "char": "👷", "name": "construction_worker_man", "keywords": ["male", "human", "wip", "guy", "build", "construction", "worker", "labor"] }, - { "category": "people", "char": "💂♀️", "name": "guardswoman", "keywords": ["uk", "gb", "british", "female", "royal", "woman"] }, - { "category": "people", "char": "💂", "name": "guardsman", "keywords": ["uk", "gb", "british", "male", "guy", "royal"] }, - { "category": "people", "char": "🕵️♀️", "name": "female_detective", "keywords": ["human", "spy", "detective", "female", "woman"] }, - { "category": "people", "char": "🕵", "name": "male_detective", "keywords": ["human", "spy", "detective"] }, - { "category": "people", "char": "🧑⚕️", "name": "health_worker", "keywords": ["doctor", "nurse", "therapist", "healthcare", "human"] }, - { "category": "people", "char": "👩⚕️", "name": "woman_health_worker", "keywords": ["doctor", "nurse", "therapist", "healthcare", "woman", "human"] }, - { "category": "people", "char": "👨⚕️", "name": "man_health_worker", "keywords": ["doctor", "nurse", "therapist", "healthcare", "man", "human"] }, - { "category": "people", "char": "🧑🌾", "name": "farmer", "keywords": ["rancher", "gardener", "human"] }, - { "category": "people", "char": "👩🌾", "name": "woman_farmer", "keywords": ["rancher", "gardener", "woman", "human"] }, - { "category": "people", "char": "👨🌾", "name": "man_farmer", "keywords": ["rancher", "gardener", "man", "human"] }, - { "category": "people", "char": "🧑🍳", "name": "cook", "keywords": ["chef", "human"] }, - { "category": "people", "char": "👩🍳", "name": "woman_cook", "keywords": ["chef", "woman", "human"] }, - { "category": "people", "char": "👨🍳", "name": "man_cook", "keywords": ["chef", "man", "human"] }, - { "category": "people", "char": "🧑🎓", "name": "student", "keywords": ["graduate", "human"] }, - { "category": "people", "char": "👩🎓", "name": "woman_student", "keywords": ["graduate", "woman", "human"] }, - { "category": "people", "char": "👨🎓", "name": "man_student", "keywords": ["graduate", "man", "human"] }, - { "category": "people", "char": "🧑🎤", "name": "singer", "keywords": ["rockstar", "entertainer", "human"] }, - { "category": "people", "char": "👩🎤", "name": "woman_singer", "keywords": ["rockstar", "entertainer", "woman", "human"] }, - { "category": "people", "char": "👨🎤", "name": "man_singer", "keywords": ["rockstar", "entertainer", "man", "human"] }, - { "category": "people", "char": "🧑🏫", "name": "teacher", "keywords": ["instructor", "professor", "human"] }, - { "category": "people", "char": "👩🏫", "name": "woman_teacher", "keywords": ["instructor", "professor", "woman", "human"] }, - { "category": "people", "char": "👨🏫", "name": "man_teacher", "keywords": ["instructor", "professor", "man", "human"] }, - { "category": "people", "char": "🧑🏭", "name": "factory_worker", "keywords": ["assembly", "industrial", "human"] }, - { "category": "people", "char": "👩🏭", "name": "woman_factory_worker", "keywords": ["assembly", "industrial", "woman", "human"] }, - { "category": "people", "char": "👨🏭", "name": "man_factory_worker", "keywords": ["assembly", "industrial", "man", "human"] }, - { "category": "people", "char": "🧑💻", "name": "technologist", "keywords": ["coder", "developer", "engineer", "programmer", "software", "human", "laptop", "computer"] }, - { "category": "people", "char": "👩💻", "name": "woman_technologist", "keywords": ["coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer"] }, - { "category": "people", "char": "👨💻", "name": "man_technologist", "keywords": ["coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer"] }, - { "category": "people", "char": "🧑💼", "name": "office_worker", "keywords": ["business", "manager", "human"] }, - { "category": "people", "char": "👩💼", "name": "woman_office_worker", "keywords": ["business", "manager", "woman", "human"] }, - { "category": "people", "char": "👨💼", "name": "man_office_worker", "keywords": ["business", "manager", "man", "human"] }, - { "category": "people", "char": "🧑🔧", "name": "mechanic", "keywords": ["plumber", "human", "wrench"] }, - { "category": "people", "char": "👩🔧", "name": "woman_mechanic", "keywords": ["plumber", "woman", "human", "wrench"] }, - { "category": "people", "char": "👨🔧", "name": "man_mechanic", "keywords": ["plumber", "man", "human", "wrench"] }, - { "category": "people", "char": "🧑🔬", "name": "scientist", "keywords": ["biologist", "chemist", "engineer", "physicist", "human"] }, - { "category": "people", "char": "👩🔬", "name": "woman_scientist", "keywords": ["biologist", "chemist", "engineer", "physicist", "woman", "human"] }, - { "category": "people", "char": "👨🔬", "name": "man_scientist", "keywords": ["biologist", "chemist", "engineer", "physicist", "man", "human"] }, - { "category": "people", "char": "🧑🎨", "name": "artist", "keywords": ["painter", "human"] }, - { "category": "people", "char": "👩🎨", "name": "woman_artist", "keywords": ["painter", "woman", "human"] }, - { "category": "people", "char": "👨🎨", "name": "man_artist", "keywords": ["painter", "man", "human"] }, - { "category": "people", "char": "🧑🚒", "name": "firefighter", "keywords": ["fireman", "human"] }, - { "category": "people", "char": "👩🚒", "name": "woman_firefighter", "keywords": ["fireman", "woman", "human"] }, - { "category": "people", "char": "👨🚒", "name": "man_firefighter", "keywords": ["fireman", "man", "human"] }, - { "category": "people", "char": "🧑✈️", "name": "pilot", "keywords": ["aviator", "plane", "human"] }, - { "category": "people", "char": "👩✈️", "name": "woman_pilot", "keywords": ["aviator", "plane", "woman", "human"] }, - { "category": "people", "char": "👨✈️", "name": "man_pilot", "keywords": ["aviator", "plane", "man", "human"] }, - { "category": "people", "char": "🧑🚀", "name": "astronaut", "keywords": ["space", "rocket", "human"] }, - { "category": "people", "char": "👩🚀", "name": "woman_astronaut", "keywords": ["space", "rocket", "woman", "human"] }, - { "category": "people", "char": "👨🚀", "name": "man_astronaut", "keywords": ["space", "rocket", "man", "human"] }, - { "category": "people", "char": "🧑⚖️", "name": "judge", "keywords": ["justice", "court", "human"] }, - { "category": "people", "char": "👩⚖️", "name": "woman_judge", "keywords": ["justice", "court", "woman", "human"] }, - { "category": "people", "char": "👨⚖️", "name": "man_judge", "keywords": ["justice", "court", "man", "human"] }, - { "category": "people", "char": "🦸♀️", "name": "woman_superhero", "keywords": ["woman", "female", "good", "heroine", "superpowers"] }, - { "category": "people", "char": "🦸♂️", "name": "man_superhero", "keywords": ["man", "male", "good", "hero", "superpowers"] }, - { "category": "people", "char": "🦹♀️", "name": "woman_supervillain", "keywords": ["woman", "female", "evil", "bad", "criminal", "heroine", "superpowers"] }, - { "category": "people", "char": "🦹♂️", "name": "man_supervillain", "keywords": ["man", "male", "evil", "bad", "criminal", "hero", "superpowers"] }, - { "category": "people", "char": "🤶", "name": "mrs_claus", "keywords": ["woman", "female", "xmas", "mother christmas"] }, - { "category": "people", "char": "\uD83E\uDDD1\u200D\uD83C\uDF84", "name": "mx_claus", "keywords": ["xmas", "christmas"] }, - { "category": "people", "char": "🎅", "name": "santa", "keywords": ["festival", "man", "male", "xmas", "father christmas"] }, - { "category": "people", "char": "🥷", "name": "ninja", "keywords": [] }, - { "category": "people", "char": "🧙♀️", "name": "sorceress", "keywords": ["woman", "female", "mage", "witch"] }, - { "category": "people", "char": "🧙♂️", "name": "wizard", "keywords": ["man", "male", "mage", "sorcerer"] }, - { "category": "people", "char": "🧝♀️", "name": "woman_elf", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧝♂️", "name": "man_elf", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧛♀️", "name": "woman_vampire", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧛♂️", "name": "man_vampire", "keywords": ["man", "male", "dracula"] }, - { "category": "people", "char": "🧟♀️", "name": "woman_zombie", "keywords": ["woman", "female", "undead", "walking dead"] }, - { "category": "people", "char": "🧟♂️", "name": "man_zombie", "keywords": ["man", "male", "dracula", "undead", "walking dead"] }, - { "category": "people", "char": "🧞♀️", "name": "woman_genie", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧞♂️", "name": "man_genie", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧜♀️", "name": "mermaid", "keywords": ["woman", "female", "merwoman", "ariel"] }, - { "category": "people", "char": "🧜♂️", "name": "merman", "keywords": ["man", "male", "triton"] }, - { "category": "people", "char": "🧚♀️", "name": "woman_fairy", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧚♂️", "name": "man_fairy", "keywords": ["man", "male"] }, - { "category": "people", "char": "👼", "name": "angel", "keywords": ["heaven", "wings", "halo"] }, - { "category": "people", "char": "\uD83E\uDDCC", "name": "troll", "keywords": [] }, - { "category": "people", "char": "🤰", "name": "pregnant_woman", "keywords": ["baby"] }, - { "category": "people", "char": "\uD83E\uDEC3", "name": "pregnant_man", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEC4", "name": "pregnant_person", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDEC5", "name": "person_with_crown", "keywords": [] }, - { "category": "people", "char": "🤱", "name": "breastfeeding", "keywords": ["nursing", "baby"] }, - { "category": "people", "char": "\uD83D\uDC69\u200D\uD83C\uDF7C", "name": "woman_feeding_baby", "keywords": [] }, - { "category": "people", "char": "\uD83D\uDC68\u200D\uD83C\uDF7C", "name": "man_feeding_baby", "keywords": [] }, - { "category": "people", "char": "\uD83E\uDDD1\u200D\uD83C\uDF7C", "name": "person_feeding_baby", "keywords": [] }, - { "category": "people", "char": "👸", "name": "princess", "keywords": ["girl", "woman", "female", "blond", "crown", "royal", "queen"] }, - { "category": "people", "char": "🤴", "name": "prince", "keywords": ["boy", "man", "male", "crown", "royal", "king"] }, - { "category": "people", "char": "👰", "name": "person_with_veil", "keywords": ["couple", "marriage", "wedding", "woman", "bride"] }, - { "category": "people", "char": "👰", "name": "bride_with_veil", "keywords": ["couple", "marriage", "wedding", "woman", "bride"] }, - { "category": "people", "char": "🤵", "name": "person_in_tuxedo", "keywords": ["couple", "marriage", "wedding", "groom"] }, - { "category": "people", "char": "🤵", "name": "man_in_tuxedo", "keywords": ["couple", "marriage", "wedding", "groom"] }, - { "category": "people", "char": "🏃♀️", "name": "running_woman", "keywords": ["woman", "walking", "exercise", "race", "running", "female"] }, - { "category": "people", "char": "🏃", "name": "running_man", "keywords": ["man", "walking", "exercise", "race", "running"] }, - { "category": "people", "char": "🚶♀️", "name": "walking_woman", "keywords": ["human", "feet", "steps", "woman", "female"] }, - { "category": "people", "char": "🚶", "name": "walking_man", "keywords": ["human", "feet", "steps"] }, - { "category": "people", "char": "💃", "name": "dancer", "keywords": ["female", "girl", "woman", "fun"] }, - { "category": "people", "char": "🕺", "name": "man_dancing", "keywords": ["male", "boy", "fun", "dancer"] }, - { "category": "people", "char": "👯", "name": "dancing_women", "keywords": ["female", "bunny", "women", "girls"] }, - { "category": "people", "char": "👯♂️", "name": "dancing_men", "keywords": ["male", "bunny", "men", "boys"] }, - { "category": "people", "char": "👫", "name": "couple", "keywords": ["pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage"] }, - { "category": "people", "char": "\uD83E\uDDD1\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1", "name": "people_holding_hands", "keywords": ["pair", "couple", "love", "like", "bromance", "friendship", "people", "human"] }, - { "category": "people", "char": "👬", "name": "two_men_holding_hands", "keywords": ["pair", "couple", "love", "like", "bromance", "friendship", "people", "man", "human"] }, - { "category": "people", "char": "👭", "name": "two_women_holding_hands", "keywords": ["pair", "couple", "love", "like", "bromance", "friendship", "people", "female", "human"] }, - { "category": "people", "char": "🫂", "name": "people_hugging", "keywords": [] }, - { "category": "people", "char": "🙇♀️", "name": "bowing_woman", "keywords": ["woman", "female", "girl"] }, - { "category": "people", "char": "🙇", "name": "bowing_man", "keywords": ["man", "male", "boy"] }, - { "category": "people", "char": "🤦♂️", "name": "man_facepalming", "keywords": ["man", "male", "boy", "disbelief"] }, - { "category": "people", "char": "🤦♀️", "name": "woman_facepalming", "keywords": ["woman", "female", "girl", "disbelief"] }, - { "category": "people", "char": "🤷", "name": "woman_shrugging", "keywords": ["woman", "female", "girl", "confused", "indifferent", "doubt"] }, - { "category": "people", "char": "🤷♂️", "name": "man_shrugging", "keywords": ["man", "male", "boy", "confused", "indifferent", "doubt"] }, - { "category": "people", "char": "💁", "name": "tipping_hand_woman", "keywords": ["female", "girl", "woman", "human", "information"] }, - { "category": "people", "char": "💁♂️", "name": "tipping_hand_man", "keywords": ["male", "boy", "man", "human", "information"] }, - { "category": "people", "char": "🙅", "name": "no_good_woman", "keywords": ["female", "girl", "woman", "nope"] }, - { "category": "people", "char": "🙅♂️", "name": "no_good_man", "keywords": ["male", "boy", "man", "nope"] }, - { "category": "people", "char": "🙆", "name": "ok_woman", "keywords": ["women", "girl", "female", "pink", "human", "woman"] }, - { "category": "people", "char": "🙆♂️", "name": "ok_man", "keywords": ["men", "boy", "male", "blue", "human", "man"] }, - { "category": "people", "char": "🙋", "name": "raising_hand_woman", "keywords": ["female", "girl", "woman"] }, - { "category": "people", "char": "🙋♂️", "name": "raising_hand_man", "keywords": ["male", "boy", "man"] }, - { "category": "people", "char": "🙎", "name": "pouting_woman", "keywords": ["female", "girl", "woman"] }, - { "category": "people", "char": "🙎♂️", "name": "pouting_man", "keywords": ["male", "boy", "man"] }, - { "category": "people", "char": "🙍", "name": "frowning_woman", "keywords": ["female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy"] }, - { "category": "people", "char": "🙍♂️", "name": "frowning_man", "keywords": ["male", "boy", "man", "sad", "depressed", "discouraged", "unhappy"] }, - { "category": "people", "char": "💇", "name": "haircut_woman", "keywords": ["female", "girl", "woman"] }, - { "category": "people", "char": "💇♂️", "name": "haircut_man", "keywords": ["male", "boy", "man"] }, - { "category": "people", "char": "💆", "name": "massage_woman", "keywords": ["female", "girl", "woman", "head"] }, - { "category": "people", "char": "💆♂️", "name": "massage_man", "keywords": ["male", "boy", "man", "head"] }, - { "category": "people", "char": "🧖♀️", "name": "woman_in_steamy_room", "keywords": ["female", "woman", "spa", "steamroom", "sauna"] }, - { "category": "people", "char": "🧖♂️", "name": "man_in_steamy_room", "keywords": ["male", "man", "spa", "steamroom", "sauna"] }, - { "category": "people", "char": "🧏♀️", "name": "woman_deaf", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧏♂️", "name": "man_deaf", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧍♀️", "name": "woman_standing", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧍♂️", "name": "man_standing", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧎♀️", "name": "woman_kneeling", "keywords": ["woman", "female"] }, - { "category": "people", "char": "🧎♂️", "name": "man_kneeling", "keywords": ["man", "male"] }, - { "category": "people", "char": "🧑🦯", "name": "person_with_probing_cane", "keywords": ["accessibility", "blind"] }, - { "category": "people", "char": "👩🦯", "name": "woman_with_probing_cane", "keywords": ["woman", "female", "accessibility", "blind"] }, - { "category": "people", "char": "👨🦯", "name": "man_with_probing_cane", "keywords": ["man", "male", "accessibility", "blind"] }, - { "category": "people", "char": "🧑🦼", "name": "person_in_motorized_wheelchair", "keywords": ["accessibility"] }, - { "category": "people", "char": "👩🦼", "name": "woman_in_motorized_wheelchair", "keywords": ["woman", "female", "accessibility"] }, - { "category": "people", "char": "👨🦼", "name": "man_in_motorized_wheelchair", "keywords": ["man", "male", "accessibility"] }, - { "category": "people", "char": "🧑🦽", "name": "person_in_manual_wheelchair", "keywords": ["accessibility"] }, - { "category": "people", "char": "👩🦽", "name": "woman_in_manual_wheelchair", "keywords": ["woman", "female", "accessibility"] }, - { "category": "people", "char": "👨🦽", "name": "man_in_manual_wheelchair", "keywords": ["man", "male", "accessibility"] }, - { "category": "people", "char": "💑", "name": "couple_with_heart_woman_man", "keywords": ["pair", "love", "like", "affection", "human", "dating", "valentines", "marriage"] }, - { "category": "people", "char": "👩❤️👩", "name": "couple_with_heart_woman_woman", "keywords": ["pair", "love", "like", "affection", "human", "dating", "valentines", "marriage"] }, - { "category": "people", "char": "👨❤️👨", "name": "couple_with_heart_man_man", "keywords": ["pair", "love", "like", "affection", "human", "dating", "valentines", "marriage"] }, - { "category": "people", "char": "💏", "name": "couplekiss_man_woman", "keywords": ["pair", "valentines", "love", "like", "dating", "marriage"] }, - { "category": "people", "char": "👩❤️💋👩", "name": "couplekiss_woman_woman", "keywords": ["pair", "valentines", "love", "like", "dating", "marriage"] }, - { "category": "people", "char": "👨❤️💋👨", "name": "couplekiss_man_man", "keywords": ["pair", "valentines", "love", "like", "dating", "marriage"] }, - { "category": "people", "char": "👪", "name": "family_man_woman_boy", "keywords": ["home", "parents", "child", "mom", "dad", "father", "mother", "people", "human"] }, - { "category": "people", "char": "👨👩👧", "name": "family_man_woman_girl", "keywords": ["home", "parents", "people", "human", "child"] }, - { "category": "people", "char": "👨👩👧👦", "name": "family_man_woman_girl_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👩👦👦", "name": "family_man_woman_boy_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👩👧👧", "name": "family_man_woman_girl_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👦", "name": "family_woman_woman_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👧", "name": "family_woman_woman_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👧👦", "name": "family_woman_woman_girl_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👦👦", "name": "family_woman_woman_boy_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👩👧👧", "name": "family_woman_woman_girl_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👦", "name": "family_man_man_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👧", "name": "family_man_man_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👧👦", "name": "family_man_man_girl_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👦👦", "name": "family_man_man_boy_boy", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👨👨👧👧", "name": "family_man_man_girl_girl", "keywords": ["home", "parents", "people", "human", "children"] }, - { "category": "people", "char": "👩👦", "name": "family_woman_boy", "keywords": ["home", "parent", "people", "human", "child"] }, - { "category": "people", "char": "👩👧", "name": "family_woman_girl", "keywords": ["home", "parent", "people", "human", "child"] }, - { "category": "people", "char": "👩👧👦", "name": "family_woman_girl_boy", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👩👦👦", "name": "family_woman_boy_boy", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👩👧👧", "name": "family_woman_girl_girl", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👨👦", "name": "family_man_boy", "keywords": ["home", "parent", "people", "human", "child"] }, - { "category": "people", "char": "👨👧", "name": "family_man_girl", "keywords": ["home", "parent", "people", "human", "child"] }, - { "category": "people", "char": "👨👧👦", "name": "family_man_girl_boy", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👨👦👦", "name": "family_man_boy_boy", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "👨👧👧", "name": "family_man_girl_girl", "keywords": ["home", "parent", "people", "human", "children"] }, - { "category": "people", "char": "🧶", "name": "yarn", "keywords": ["ball", "crochet", "knit"] }, - { "category": "people", "char": "🧵", "name": "thread", "keywords": ["needle", "sewing", "spool", "string"] }, - { "category": "people", "char": "🧥", "name": "coat", "keywords": ["jacket"] }, - { "category": "people", "char": "🥼", "name": "labcoat", "keywords": ["doctor", "experiment", "scientist", "chemist"] }, - { "category": "people", "char": "👚", "name": "womans_clothes", "keywords": ["fashion", "shopping_bags", "female"] }, - { "category": "people", "char": "👕", "name": "tshirt", "keywords": ["fashion", "cloth", "casual", "shirt", "tee"] }, - { "category": "people", "char": "👖", "name": "jeans", "keywords": ["fashion", "shopping"] }, - { "category": "people", "char": "👔", "name": "necktie", "keywords": ["shirt", "suitup", "formal", "fashion", "cloth", "business"] }, - { "category": "people", "char": "👗", "name": "dress", "keywords": ["clothes", "fashion", "shopping"] }, - { "category": "people", "char": "👙", "name": "bikini", "keywords": ["swimming", "female", "woman", "girl", "fashion", "beach", "summer"] }, - { "category": "people", "char": "🩱", "name": "one_piece_swimsuit", "keywords": ["swimming", "female", "woman", "girl", "fashion", "beach", "summer"] }, - { "category": "people", "char": "👘", "name": "kimono", "keywords": ["dress", "fashion", "women", "female", "japanese"] }, - { "category": "people", "char": "🥻", "name": "sari", "keywords": ["dress", "fashion", "women", "female"] }, - { "category": "people", "char": "🩲", "name": "briefs", "keywords": ["dress", "fashion"] }, - { "category": "people", "char": "🩳", "name": "shorts", "keywords": ["dress", "fashion"] }, - { "category": "people", "char": "💄", "name": "lipstick", "keywords": ["female", "girl", "fashion", "woman"] }, - { "category": "people", "char": "💋", "name": "kiss", "keywords": ["face", "lips", "love", "like", "affection", "valentines"] }, - { "category": "people", "char": "👣", "name": "footprints", "keywords": ["feet", "tracking", "walking", "beach"] }, - { "category": "people", "char": "🥿", "name": "flat_shoe", "keywords": ["ballet", "slip-on", "slipper"] }, - { "category": "people", "char": "👠", "name": "high_heel", "keywords": ["fashion", "shoes", "female", "pumps", "stiletto"] }, - { "category": "people", "char": "👡", "name": "sandal", "keywords": ["shoes", "fashion", "flip flops"] }, - { "category": "people", "char": "👢", "name": "boot", "keywords": ["shoes", "fashion"] }, - { "category": "people", "char": "👞", "name": "mans_shoe", "keywords": ["fashion", "male"] }, - { "category": "people", "char": "👟", "name": "athletic_shoe", "keywords": ["shoes", "sports", "sneakers"] }, - { "category": "people", "char": "🩴", "name": "thong_sandal", "keywords": [] }, - { "category": "people", "char": "🩰", "name": "ballet_shoes", "keywords": ["shoes", "sports"] }, - { "category": "people", "char": "🧦", "name": "socks", "keywords": ["stockings", "clothes"] }, - { "category": "people", "char": "🧤", "name": "gloves", "keywords": ["hands", "winter", "clothes"] }, - { "category": "people", "char": "🧣", "name": "scarf", "keywords": ["neck", "winter", "clothes"] }, - { "category": "people", "char": "👒", "name": "womans_hat", "keywords": ["fashion", "accessories", "female", "lady", "spring"] }, - { "category": "people", "char": "🎩", "name": "tophat", "keywords": ["magic", "gentleman", "classy", "circus"] }, - { "category": "people", "char": "🧢", "name": "billed_hat", "keywords": ["cap", "baseball"] }, - { "category": "people", "char": "⛑", "name": "rescue_worker_helmet", "keywords": ["construction", "build"] }, - { "category": "people", "char": "🪖", "name": "military_helmet", "keywords": [] }, - { "category": "people", "char": "🎓", "name": "mortar_board", "keywords": ["school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education"] }, - { "category": "people", "char": "👑", "name": "crown", "keywords": ["king", "kod", "leader", "royalty", "lord"] }, - { "category": "people", "char": "🎒", "name": "school_satchel", "keywords": ["student", "education", "bag", "backpack"] }, - { "category": "people", "char": "🧳", "name": "luggage", "keywords": ["packing", "travel"] }, - { "category": "people", "char": "👝", "name": "pouch", "keywords": ["bag", "accessories", "shopping"] }, - { "category": "people", "char": "👛", "name": "purse", "keywords": ["fashion", "accessories", "money", "sales", "shopping"] }, - { "category": "people", "char": "👜", "name": "handbag", "keywords": ["fashion", "accessory", "accessories", "shopping"] }, - { "category": "people", "char": "💼", "name": "briefcase", "keywords": ["business", "documents", "work", "law", "legal", "job", "career"] }, - { "category": "people", "char": "👓", "name": "eyeglasses", "keywords": ["fashion", "accessories", "eyesight", "nerdy", "dork", "geek"] }, - { "category": "people", "char": "🕶", "name": "dark_sunglasses", "keywords": ["face", "cool", "accessories"] }, - { "category": "people", "char": "🥽", "name": "goggles", "keywords": ["eyes", "protection", "safety"] }, - { "category": "people", "char": "💍", "name": "ring", "keywords": ["wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement"] }, - { "category": "people", "char": "🌂", "name": "closed_umbrella", "keywords": ["weather", "rain", "drizzle"] }, - { "category": "animals_and_nature", "char": "🐶", "name": "dog", "keywords": ["animal", "friend", "nature", "woof", "puppy", "pet", "faithful"] }, - { "category": "animals_and_nature", "char": "🐱", "name": "cat", "keywords": ["animal", "meow", "nature", "pet", "kitten"] }, - { "category": "animals_and_nature", "char": "🐈⬛", "name": "black_cat", "keywords": ["animal", "meow", "nature", "pet", "kitten"] }, - { "category": "animals_and_nature", "char": "🐭", "name": "mouse", "keywords": ["animal", "nature", "cheese_wedge", "rodent"] }, - { "category": "animals_and_nature", "char": "🐹", "name": "hamster", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐰", "name": "rabbit", "keywords": ["animal", "nature", "pet", "spring", "magic", "bunny"] }, - { "category": "animals_and_nature", "char": "🦊", "name": "fox_face", "keywords": ["animal", "nature", "face"] }, - { "category": "animals_and_nature", "char": "🐻", "name": "bear", "keywords": ["animal", "nature", "wild"] }, - { "category": "animals_and_nature", "char": "🐼", "name": "panda_face", "keywords": ["animal", "nature", "panda"] }, - { "category": "animals_and_nature", "char": "🐨", "name": "koala", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐯", "name": "tiger", "keywords": ["animal", "cat", "danger", "wild", "nature", "roar"] }, - { "category": "animals_and_nature", "char": "🦁", "name": "lion", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐮", "name": "cow", "keywords": ["beef", "ox", "animal", "nature", "moo", "milk"] }, - { "category": "animals_and_nature", "char": "🐷", "name": "pig", "keywords": ["animal", "oink", "nature"] }, - { "category": "animals_and_nature", "char": "🐽", "name": "pig_nose", "keywords": ["animal", "oink"] }, - { "category": "animals_and_nature", "char": "🐸", "name": "frog", "keywords": ["animal", "nature", "croak", "toad"] }, - { "category": "animals_and_nature", "char": "🦑", "name": "squid", "keywords": ["animal", "nature", "ocean", "sea"] }, - { "category": "animals_and_nature", "char": "🐙", "name": "octopus", "keywords": ["animal", "creature", "ocean", "sea", "nature", "beach"] }, - { "category": "animals_and_nature", "char": "🦐", "name": "shrimp", "keywords": ["animal", "ocean", "nature", "seafood"] }, - { "category": "animals_and_nature", "char": "🐵", "name": "monkey_face", "keywords": ["animal", "nature", "circus"] }, - { "category": "animals_and_nature", "char": "🦍", "name": "gorilla", "keywords": ["animal", "nature", "circus"] }, - { "category": "animals_and_nature", "char": "🙈", "name": "see_no_evil", "keywords": ["monkey", "animal", "nature", "haha"] }, - { "category": "animals_and_nature", "char": "🙉", "name": "hear_no_evil", "keywords": ["animal", "monkey", "nature"] }, - { "category": "animals_and_nature", "char": "🙊", "name": "speak_no_evil", "keywords": ["monkey", "animal", "nature", "omg"] }, - { "category": "animals_and_nature", "char": "🐒", "name": "monkey", "keywords": ["animal", "nature", "banana", "circus"] }, - { "category": "animals_and_nature", "char": "🐔", "name": "chicken", "keywords": ["animal", "cluck", "nature", "bird"] }, - { "category": "animals_and_nature", "char": "🐧", "name": "penguin", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐦", "name": "bird", "keywords": ["animal", "nature", "fly", "tweet", "spring"] }, - { "category": "animals_and_nature", "char": "🐤", "name": "baby_chick", "keywords": ["animal", "chicken", "bird"] }, - { "category": "animals_and_nature", "char": "🐣", "name": "hatching_chick", "keywords": ["animal", "chicken", "egg", "born", "baby", "bird"] }, - { "category": "animals_and_nature", "char": "🐥", "name": "hatched_chick", "keywords": ["animal", "chicken", "baby", "bird"] }, - { "category": "animals_and_nature", "char": "🦆", "name": "duck", "keywords": ["animal", "nature", "bird", "mallard"] }, - { "category": "animals_and_nature", "char": "🦅", "name": "eagle", "keywords": ["animal", "nature", "bird"] }, - { "category": "animals_and_nature", "char": "🦉", "name": "owl", "keywords": ["animal", "nature", "bird", "hoot"] }, - { "category": "animals_and_nature", "char": "🦇", "name": "bat", "keywords": ["animal", "nature", "blind", "vampire"] }, - { "category": "animals_and_nature", "char": "🐺", "name": "wolf", "keywords": ["animal", "nature", "wild"] }, - { "category": "animals_and_nature", "char": "🐗", "name": "boar", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐴", "name": "horse", "keywords": ["animal", "brown", "nature"] }, - { "category": "animals_and_nature", "char": "🦄", "name": "unicorn", "keywords": ["animal", "nature", "mystical"] }, - { "category": "animals_and_nature", "char": "🐝", "name": "honeybee", "keywords": ["animal", "insect", "nature", "bug", "spring", "honey"] }, - { "category": "animals_and_nature", "char": "🐛", "name": "bug", "keywords": ["animal", "insect", "nature", "worm"] }, - { "category": "animals_and_nature", "char": "🦋", "name": "butterfly", "keywords": ["animal", "insect", "nature", "caterpillar"] }, - { "category": "animals_and_nature", "char": "🐌", "name": "snail", "keywords": ["slow", "animal", "shell"] }, - { "category": "animals_and_nature", "char": "🐞", "name": "lady_beetle", "keywords": ["animal", "insect", "nature", "ladybug"] }, - { "category": "animals_and_nature", "char": "🐜", "name": "ant", "keywords": ["animal", "insect", "nature", "bug"] }, - { "category": "animals_and_nature", "char": "🦗", "name": "grasshopper", "keywords": ["animal", "cricket", "chirp"] }, - { "category": "animals_and_nature", "char": "🕷", "name": "spider", "keywords": ["animal", "arachnid"] }, - { "category": "animals_and_nature", "char": "🪲", "name": "beetle", "keywords": ["animal"] }, - { "category": "animals_and_nature", "char": "🪳", "name": "cockroach", "keywords": ["animal"] }, - { "category": "animals_and_nature", "char": "🪰", "name": "fly", "keywords": ["animal"] }, - { "category": "animals_and_nature", "char": "🪱", "name": "worm", "keywords": ["animal"] }, - { "category": "animals_and_nature", "char": "🦂", "name": "scorpion", "keywords": ["animal", "arachnid"] }, - { "category": "animals_and_nature", "char": "🦀", "name": "crab", "keywords": ["animal", "crustacean"] }, - { "category": "animals_and_nature", "char": "🐍", "name": "snake", "keywords": ["animal", "evil", "nature", "hiss", "python"] }, - { "category": "animals_and_nature", "char": "🦎", "name": "lizard", "keywords": ["animal", "nature", "reptile"] }, - { "category": "animals_and_nature", "char": "🦖", "name": "t-rex", "keywords": ["animal", "nature", "dinosaur", "tyrannosaurus", "extinct"] }, - { "category": "animals_and_nature", "char": "🦕", "name": "sauropod", "keywords": ["animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct"] }, - { "category": "animals_and_nature", "char": "🐢", "name": "turtle", "keywords": ["animal", "slow", "nature", "tortoise"] }, - { "category": "animals_and_nature", "char": "🐠", "name": "tropical_fish", "keywords": ["animal", "swim", "ocean", "beach", "nemo"] }, - { "category": "animals_and_nature", "char": "🐟", "name": "fish", "keywords": ["animal", "food", "nature"] }, - { "category": "animals_and_nature", "char": "🐡", "name": "blowfish", "keywords": ["animal", "nature", "food", "sea", "ocean"] }, - { "category": "animals_and_nature", "char": "🐬", "name": "dolphin", "keywords": ["animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach"] }, - { "category": "animals_and_nature", "char": "🦈", "name": "shark", "keywords": ["animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach"] }, - { "category": "animals_and_nature", "char": "🐳", "name": "whale", "keywords": ["animal", "nature", "sea", "ocean"] }, - { "category": "animals_and_nature", "char": "🐋", "name": "whale2", "keywords": ["animal", "nature", "sea", "ocean"] }, - { "category": "animals_and_nature", "char": "🐊", "name": "crocodile", "keywords": ["animal", "nature", "reptile", "lizard", "alligator"] }, - { "category": "animals_and_nature", "char": "🐆", "name": "leopard", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦓", "name": "zebra", "keywords": ["animal", "nature", "stripes", "safari"] }, - { "category": "animals_and_nature", "char": "🐅", "name": "tiger2", "keywords": ["animal", "nature", "roar"] }, - { "category": "animals_and_nature", "char": "🐃", "name": "water_buffalo", "keywords": ["animal", "nature", "ox", "cow"] }, - { "category": "animals_and_nature", "char": "🐂", "name": "ox", "keywords": ["animal", "cow", "beef"] }, - { "category": "animals_and_nature", "char": "🐄", "name": "cow2", "keywords": ["beef", "ox", "animal", "nature", "moo", "milk"] }, - { "category": "animals_and_nature", "char": "🦌", "name": "deer", "keywords": ["animal", "nature", "horns", "venison"] }, - { "category": "animals_and_nature", "char": "🐪", "name": "dromedary_camel", "keywords": ["animal", "hot", "desert", "hump"] }, - { "category": "animals_and_nature", "char": "🐫", "name": "camel", "keywords": ["animal", "nature", "hot", "desert", "hump"] }, - { "category": "animals_and_nature", "char": "🦒", "name": "giraffe", "keywords": ["animal", "nature", "spots", "safari"] }, - { "category": "animals_and_nature", "char": "🐘", "name": "elephant", "keywords": ["animal", "nature", "nose", "th", "circus"] }, - { "category": "animals_and_nature", "char": "🦏", "name": "rhinoceros", "keywords": ["animal", "nature", "horn"] }, - { "category": "animals_and_nature", "char": "🐐", "name": "goat", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐏", "name": "ram", "keywords": ["animal", "sheep", "nature"] }, - { "category": "animals_and_nature", "char": "🐑", "name": "sheep", "keywords": ["animal", "nature", "wool", "shipit"] }, - { "category": "animals_and_nature", "char": "🐎", "name": "racehorse", "keywords": ["animal", "gamble", "luck"] }, - { "category": "animals_and_nature", "char": "🐖", "name": "pig2", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐀", "name": "rat", "keywords": ["animal", "mouse", "rodent"] }, - { "category": "animals_and_nature", "char": "🐁", "name": "mouse2", "keywords": ["animal", "nature", "rodent"] }, - { "category": "animals_and_nature", "char": "🐓", "name": "rooster", "keywords": ["animal", "nature", "chicken"] }, - { "category": "animals_and_nature", "char": "🦃", "name": "turkey", "keywords": ["animal", "bird"] }, - { "category": "animals_and_nature", "char": "🕊", "name": "dove", "keywords": ["animal", "bird"] }, - { "category": "animals_and_nature", "char": "🐕", "name": "dog2", "keywords": ["animal", "nature", "friend", "doge", "pet", "faithful"] }, - { "category": "animals_and_nature", "char": "🐩", "name": "poodle", "keywords": ["dog", "animal", "101", "nature", "pet"] }, - { "category": "animals_and_nature", "char": "🐈", "name": "cat2", "keywords": ["animal", "meow", "pet", "cats"] }, - { "category": "animals_and_nature", "char": "🐇", "name": "rabbit2", "keywords": ["animal", "nature", "pet", "magic", "spring"] }, - { "category": "animals_and_nature", "char": "🐿", "name": "chipmunk", "keywords": ["animal", "nature", "rodent", "squirrel"] }, - { "category": "animals_and_nature", "char": "🦔", "name": "hedgehog", "keywords": ["animal", "nature", "spiny"] }, - { "category": "animals_and_nature", "char": "🦝", "name": "raccoon", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦙", "name": "llama", "keywords": ["animal", "nature", "alpaca"] }, - { "category": "animals_and_nature", "char": "🦛", "name": "hippopotamus", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦘", "name": "kangaroo", "keywords": ["animal", "nature", "australia", "joey", "hop", "marsupial"] }, - { "category": "animals_and_nature", "char": "🦡", "name": "badger", "keywords": ["animal", "nature", "honey"] }, - { "category": "animals_and_nature", "char": "🦢", "name": "swan", "keywords": ["animal", "nature", "bird"] }, - { "category": "animals_and_nature", "char": "🦚", "name": "peacock", "keywords": ["animal", "nature", "peahen", "bird"] }, - { "category": "animals_and_nature", "char": "🦜", "name": "parrot", "keywords": ["animal", "nature", "bird", "pirate", "talk"] }, - { "category": "animals_and_nature", "char": "🦞", "name": "lobster", "keywords": ["animal", "nature", "bisque", "claws", "seafood"] }, - { "category": "animals_and_nature", "char": "🦠", "name": "microbe", "keywords": ["amoeba", "bacteria", "germs"] }, - { "category": "animals_and_nature", "char": "🦟", "name": "mosquito", "keywords": ["animal", "nature", "insect", "malaria"] }, - { "category": "animals_and_nature", "char": "🦬", "name": "bison", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦣", "name": "mammoth", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦫", "name": "beaver", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐻❄️", "name": "polar_bear", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦤", "name": "dodo", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🪶", "name": "feather", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦭", "name": "seal", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐾", "name": "paw_prints", "keywords": ["animal", "tracking", "footprints", "dog", "cat", "pet", "feet", "paws", "kitty"] }, - { "category": "animals_and_nature", "char": "🐉", "name": "dragon", "keywords": ["animal", "myth", "nature", "chinese", "green"] }, - { "category": "animals_and_nature", "char": "🐲", "name": "dragon_face", "keywords": ["animal", "myth", "nature", "chinese", "green"] }, - { "category": "animals_and_nature", "char": "🦧", "name": "orangutan", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦮", "name": "guide_dog", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🐕🦺", "name": "service_dog", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦥", "name": "sloth", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦦", "name": "otter", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦨", "name": "skunk", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🦩", "name": "flamingo", "keywords": ["animal", "nature"] }, - { "category": "animals_and_nature", "char": "🌵", "name": "cactus", "keywords": ["vegetable", "plant", "nature"] }, - { "category": "animals_and_nature", "char": "🎄", "name": "christmas_tree", "keywords": ["festival", "vacation", "december", "xmas", "celebration"] }, - { "category": "animals_and_nature", "char": "🌲", "name": "evergreen_tree", "keywords": ["plant", "nature"] }, - { "category": "animals_and_nature", "char": "🌳", "name": "deciduous_tree", "keywords": ["plant", "nature"] }, - { "category": "animals_and_nature", "char": "🌴", "name": "palm_tree", "keywords": ["plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical"] }, - { "category": "animals_and_nature", "char": "🌱", "name": "seedling", "keywords": ["plant", "nature", "grass", "lawn", "spring"] }, - { "category": "animals_and_nature", "char": "🌿", "name": "herb", "keywords": ["vegetable", "plant", "medicine", "weed", "grass", "lawn"] }, - { "category": "animals_and_nature", "char": "☘", "name": "shamrock", "keywords": ["vegetable", "plant", "nature", "irish", "clover"] }, - { "category": "animals_and_nature", "char": "🍀", "name": "four_leaf_clover", "keywords": ["vegetable", "plant", "nature", "lucky", "irish"] }, - { "category": "animals_and_nature", "char": "🎍", "name": "bamboo", "keywords": ["plant", "nature", "vegetable", "panda", "pine_decoration"] }, - { "category": "animals_and_nature", "char": "🎋", "name": "tanabata_tree", "keywords": ["plant", "nature", "branch", "summer"] }, - { "category": "animals_and_nature", "char": "🍃", "name": "leaves", "keywords": ["nature", "plant", "tree", "vegetable", "grass", "lawn", "spring"] }, - { "category": "animals_and_nature", "char": "🍂", "name": "fallen_leaf", "keywords": ["nature", "plant", "vegetable", "leaves"] }, - { "category": "animals_and_nature", "char": "🍁", "name": "maple_leaf", "keywords": ["nature", "plant", "vegetable", "ca", "fall"] }, - { "category": "animals_and_nature", "char": "🌾", "name": "ear_of_rice", "keywords": ["nature", "plant"] }, - { "category": "animals_and_nature", "char": "🌺", "name": "hibiscus", "keywords": ["plant", "vegetable", "flowers", "beach"] }, - { "category": "animals_and_nature", "char": "🌻", "name": "sunflower", "keywords": ["nature", "plant", "fall"] }, - { "category": "animals_and_nature", "char": "🌹", "name": "rose", "keywords": ["flowers", "valentines", "love", "spring"] }, - { "category": "animals_and_nature", "char": "🥀", "name": "wilted_flower", "keywords": ["plant", "nature", "flower"] }, - { "category": "animals_and_nature", "char": "🌷", "name": "tulip", "keywords": ["flowers", "plant", "nature", "summer", "spring"] }, - { "category": "animals_and_nature", "char": "🌼", "name": "blossom", "keywords": ["nature", "flowers", "yellow"] }, - { "category": "animals_and_nature", "char": "🌸", "name": "cherry_blossom", "keywords": ["nature", "plant", "spring", "flower"] }, - { "category": "animals_and_nature", "char": "💐", "name": "bouquet", "keywords": ["flowers", "nature", "spring"] }, - { "category": "animals_and_nature", "char": "🍄", "name": "mushroom", "keywords": ["plant", "vegetable"] }, - { "category": "animals_and_nature", "char": "🪴", "name": "potted_plant", "keywords": ["plant"] }, - { "category": "animals_and_nature", "char": "🌰", "name": "chestnut", "keywords": ["food", "squirrel"] }, - { "category": "animals_and_nature", "char": "🎃", "name": "jack_o_lantern", "keywords": ["halloween", "light", "pumpkin", "creepy", "fall"] }, - { "category": "animals_and_nature", "char": "🐚", "name": "shell", "keywords": ["nature", "sea", "beach"] }, - { "category": "animals_and_nature", "char": "🕸", "name": "spider_web", "keywords": ["animal", "insect", "arachnid", "silk"] }, - { "category": "animals_and_nature", "char": "🌎", "name": "earth_americas", "keywords": ["globe", "world", "USA", "international"] }, - { "category": "animals_and_nature", "char": "🌍", "name": "earth_africa", "keywords": ["globe", "world", "international"] }, - { "category": "animals_and_nature", "char": "🌏", "name": "earth_asia", "keywords": ["globe", "world", "east", "international"] }, - { "category": "animals_and_nature", "char": "🪐", "name": "ringed_planet", "keywords": ["saturn"] }, - { "category": "animals_and_nature", "char": "🌕", "name": "full_moon", "keywords": ["nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌖", "name": "waning_gibbous_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon"] }, - { "category": "animals_and_nature", "char": "🌗", "name": "last_quarter_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌘", "name": "waning_crescent_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌑", "name": "new_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌒", "name": "waxing_crescent_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌓", "name": "first_quarter_moon", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌔", "name": "waxing_gibbous_moon", "keywords": ["nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌚", "name": "new_moon_with_face", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌝", "name": "full_moon_with_face", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌛", "name": "first_quarter_moon_with_face", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌜", "name": "last_quarter_moon_with_face", "keywords": ["nature", "twilight", "planet", "space", "night", "evening", "sleep"] }, - { "category": "animals_and_nature", "char": "🌞", "name": "sun_with_face", "keywords": ["nature", "morning", "sky"] }, - { "category": "animals_and_nature", "char": "🌙", "name": "crescent_moon", "keywords": ["night", "sleep", "sky", "evening", "magic"] }, - { "category": "animals_and_nature", "char": "⭐", "name": "star", "keywords": ["night", "yellow"] }, - { "category": "animals_and_nature", "char": "🌟", "name": "star2", "keywords": ["night", "sparkle", "awesome", "good", "magic"] }, - { "category": "animals_and_nature", "char": "💫", "name": "dizzy", "keywords": ["star", "sparkle", "shoot", "magic"] }, - { "category": "animals_and_nature", "char": "✨", "name": "sparkles", "keywords": ["stars", "shine", "shiny", "cool", "awesome", "good", "magic"] }, - { "category": "animals_and_nature", "char": "☄", "name": "comet", "keywords": ["space"] }, - { "category": "animals_and_nature", "char": "☀️", "name": "sunny", "keywords": ["weather", "nature", "brightness", "summer", "beach", "spring"] }, - { "category": "animals_and_nature", "char": "🌤", "name": "sun_behind_small_cloud", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "⛅", "name": "partly_sunny", "keywords": ["weather", "nature", "cloudy", "morning", "fall", "spring"] }, - { "category": "animals_and_nature", "char": "🌥", "name": "sun_behind_large_cloud", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "🌦", "name": "sun_behind_rain_cloud", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "☁️", "name": "cloud", "keywords": ["weather", "sky"] }, - { "category": "animals_and_nature", "char": "🌧", "name": "cloud_with_rain", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "⛈", "name": "cloud_with_lightning_and_rain", "keywords": ["weather", "lightning"] }, - { "category": "animals_and_nature", "char": "🌩", "name": "cloud_with_lightning", "keywords": ["weather", "thunder"] }, - { "category": "animals_and_nature", "char": "⚡", "name": "zap", "keywords": ["thunder", "weather", "lightning bolt", "fast"] }, - { "category": "animals_and_nature", "char": "🔥", "name": "fire", "keywords": ["hot", "cook", "flame"] }, - { "category": "animals_and_nature", "char": "💥", "name": "boom", "keywords": ["bomb", "explode", "explosion", "collision", "blown"] }, - { "category": "animals_and_nature", "char": "❄️", "name": "snowflake", "keywords": ["winter", "season", "cold", "weather", "christmas", "xmas"] }, - { "category": "animals_and_nature", "char": "🌨", "name": "cloud_with_snow", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "⛄", "name": "snowman", "keywords": ["winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow"] }, - { "category": "animals_and_nature", "char": "☃", "name": "snowman_with_snow", "keywords": ["winter", "season", "cold", "weather", "christmas", "xmas", "frozen"] }, - { "category": "animals_and_nature", "char": "🌬", "name": "wind_face", "keywords": ["gust", "air"] }, - { "category": "animals_and_nature", "char": "💨", "name": "dash", "keywords": ["wind", "air", "fast", "shoo", "fart", "smoke", "puff"] }, - { "category": "animals_and_nature", "char": "🌪", "name": "tornado", "keywords": ["weather", "cyclone", "twister"] }, - { "category": "animals_and_nature", "char": "🌫", "name": "fog", "keywords": ["weather"] }, - { "category": "animals_and_nature", "char": "☂", "name": "open_umbrella", "keywords": ["weather", "spring"] }, - { "category": "animals_and_nature", "char": "☔", "name": "umbrella", "keywords": ["rainy", "weather", "spring"] }, - { "category": "animals_and_nature", "char": "💧", "name": "droplet", "keywords": ["water", "drip", "faucet", "spring"] }, - { "category": "animals_and_nature", "char": "💦", "name": "sweat_drops", "keywords": ["water", "drip", "oops"] }, - { "category": "animals_and_nature", "char": "🌊", "name": "ocean", "keywords": ["sea", "water", "wave", "nature", "tsunami", "disaster"] }, - { "category": "animals_and_nature", "char": "\uD83E\uDEB7", "name": "lotus", "keywords": [] }, - { "category": "animals_and_nature", "char": "\uD83E\uDEB8", "name": "coral", "keywords": [] }, - { "category": "animals_and_nature", "char": "\uD83E\uDEB9", "name": "empty_nest", "keywords": [] }, - { "category": "animals_and_nature", "char": "\uD83E\uDEBA", "name": "nest_with_eggs", "keywords": [] }, - { "category": "food_and_drink", "char": "🍏", "name": "green_apple", "keywords": ["fruit", "nature"] }, - { "category": "food_and_drink", "char": "🍎", "name": "apple", "keywords": ["fruit", "mac", "school"] }, - { "category": "food_and_drink", "char": "🍐", "name": "pear", "keywords": ["fruit", "nature", "food"] }, - { "category": "food_and_drink", "char": "🍊", "name": "tangerine", "keywords": ["food", "fruit", "nature", "orange"] }, - { "category": "food_and_drink", "char": "🍋", "name": "lemon", "keywords": ["fruit", "nature"] }, - { "category": "food_and_drink", "char": "🍌", "name": "banana", "keywords": ["fruit", "food", "monkey"] }, - { "category": "food_and_drink", "char": "🍉", "name": "watermelon", "keywords": ["fruit", "food", "picnic", "summer"] }, - { "category": "food_and_drink", "char": "🍇", "name": "grapes", "keywords": ["fruit", "food", "wine"] }, - { "category": "food_and_drink", "char": "🍓", "name": "strawberry", "keywords": ["fruit", "food", "nature"] }, - { "category": "food_and_drink", "char": "🍈", "name": "melon", "keywords": ["fruit", "nature", "food"] }, - { "category": "food_and_drink", "char": "🍒", "name": "cherries", "keywords": ["food", "fruit"] }, - { "category": "food_and_drink", "char": "🍑", "name": "peach", "keywords": ["fruit", "nature", "food"] }, - { "category": "food_and_drink", "char": "🍍", "name": "pineapple", "keywords": ["fruit", "nature", "food"] }, - { "category": "food_and_drink", "char": "🥥", "name": "coconut", "keywords": ["fruit", "nature", "food", "palm"] }, - { "category": "food_and_drink", "char": "🥝", "name": "kiwi_fruit", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🥭", "name": "mango", "keywords": ["fruit", "food", "tropical"] }, - { "category": "food_and_drink", "char": "🥑", "name": "avocado", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🥦", "name": "broccoli", "keywords": ["fruit", "food", "vegetable"] }, - { "category": "food_and_drink", "char": "🍅", "name": "tomato", "keywords": ["fruit", "vegetable", "nature", "food"] }, - { "category": "food_and_drink", "char": "🍆", "name": "eggplant", "keywords": ["vegetable", "nature", "food", "aubergine"] }, - { "category": "food_and_drink", "char": "🥒", "name": "cucumber", "keywords": ["fruit", "food", "pickle"] }, - { "category": "food_and_drink", "char": "🫐", "name": "blueberries", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🫒", "name": "olive", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🫑", "name": "bell_pepper", "keywords": ["fruit", "food"] }, - { "category": "food_and_drink", "char": "🥕", "name": "carrot", "keywords": ["vegetable", "food", "orange"] }, - { "category": "food_and_drink", "char": "🌶", "name": "hot_pepper", "keywords": ["food", "spicy", "chilli", "chili"] }, - { "category": "food_and_drink", "char": "🥔", "name": "potato", "keywords": ["food", "tuber", "vegatable", "starch"] }, - { "category": "food_and_drink", "char": "🌽", "name": "corn", "keywords": ["food", "vegetable", "plant"] }, - { "category": "food_and_drink", "char": "🥬", "name": "leafy_greens", "keywords": ["food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce"] }, - { "category": "food_and_drink", "char": "🍠", "name": "sweet_potato", "keywords": ["food", "nature"] }, - { "category": "food_and_drink", "char": "🥜", "name": "peanuts", "keywords": ["food", "nut"] }, - { "category": "food_and_drink", "char": "🧄", "name": "garlic", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🧅", "name": "onion", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🍯", "name": "honey_pot", "keywords": ["bees", "sweet", "kitchen"] }, - { "category": "food_and_drink", "char": "🥐", "name": "croissant", "keywords": ["food", "bread", "french"] }, - { "category": "food_and_drink", "char": "🍞", "name": "bread", "keywords": ["food", "wheat", "breakfast", "toast", "mame"] }, - { "category": "food_and_drink", "char": "🥖", "name": "baguette_bread", "keywords": ["food", "bread", "french"] }, - { "category": "food_and_drink", "char": "🥯", "name": "bagel", "keywords": ["food", "bread", "bakery", "schmear"] }, - { "category": "food_and_drink", "char": "🥨", "name": "pretzel", "keywords": ["food", "bread", "twisted"] }, - { "category": "food_and_drink", "char": "🧀", "name": "cheese", "keywords": ["food", "cheddar"] }, - { "category": "food_and_drink", "char": "🥚", "name": "egg", "keywords": ["food", "chicken", "breakfast"] }, - { "category": "food_and_drink", "char": "🥓", "name": "bacon", "keywords": ["food", "breakfast", "pork", "pig", "meat"] }, - { "category": "food_and_drink", "char": "🥩", "name": "steak", "keywords": ["food", "cow", "meat", "cut", "chop", "lambchop", "porkchop"] }, - { "category": "food_and_drink", "char": "🥞", "name": "pancakes", "keywords": ["food", "breakfast", "flapjacks", "hotcakes"] }, - { "category": "food_and_drink", "char": "🍗", "name": "poultry_leg", "keywords": ["food", "meat", "drumstick", "bird", "chicken", "turkey"] }, - { "category": "food_and_drink", "char": "🍖", "name": "meat_on_bone", "keywords": ["good", "food", "drumstick"] }, - { "category": "food_and_drink", "char": "🦴", "name": "bone", "keywords": ["skeleton"] }, - { "category": "food_and_drink", "char": "🍤", "name": "fried_shrimp", "keywords": ["food", "animal", "appetizer", "summer"] }, - { "category": "food_and_drink", "char": "🍳", "name": "fried_egg", "keywords": ["food", "breakfast", "kitchen", "egg"] }, - { "category": "food_and_drink", "char": "🍔", "name": "hamburger", "keywords": ["meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king"] }, - { "category": "food_and_drink", "char": "🍟", "name": "fries", "keywords": ["chips", "snack", "fast food"] }, - { "category": "food_and_drink", "char": "🥙", "name": "stuffed_flatbread", "keywords": ["food", "flatbread", "stuffed", "gyro"] }, - { "category": "food_and_drink", "char": "🌭", "name": "hotdog", "keywords": ["food", "frankfurter"] }, - { "category": "food_and_drink", "char": "🍕", "name": "pizza", "keywords": ["food", "party"] }, - { "category": "food_and_drink", "char": "🥪", "name": "sandwich", "keywords": ["food", "lunch", "bread"] }, - { "category": "food_and_drink", "char": "🥫", "name": "canned_food", "keywords": ["food", "soup"] }, - { "category": "food_and_drink", "char": "🍝", "name": "spaghetti", "keywords": ["food", "italian", "noodle"] }, - { "category": "food_and_drink", "char": "🌮", "name": "taco", "keywords": ["food", "mexican"] }, - { "category": "food_and_drink", "char": "🌯", "name": "burrito", "keywords": ["food", "mexican"] }, - { "category": "food_and_drink", "char": "🥗", "name": "green_salad", "keywords": ["food", "healthy", "lettuce"] }, - { "category": "food_and_drink", "char": "🥘", "name": "shallow_pan_of_food", "keywords": ["food", "cooking", "casserole", "paella"] }, - { "category": "food_and_drink", "char": "🍜", "name": "ramen", "keywords": ["food", "japanese", "noodle", "chopsticks"] }, - { "category": "food_and_drink", "char": "🍲", "name": "stew", "keywords": ["food", "meat", "soup"] }, - { "category": "food_and_drink", "char": "🍥", "name": "fish_cake", "keywords": ["food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen"] }, - { "category": "food_and_drink", "char": "🥠", "name": "fortune_cookie", "keywords": ["food", "prophecy"] }, - { "category": "food_and_drink", "char": "🍣", "name": "sushi", "keywords": ["food", "fish", "japanese", "rice"] }, - { "category": "food_and_drink", "char": "🍱", "name": "bento", "keywords": ["food", "japanese", "box"] }, - { "category": "food_and_drink", "char": "🍛", "name": "curry", "keywords": ["food", "spicy", "hot", "indian"] }, - { "category": "food_and_drink", "char": "🍙", "name": "rice_ball", "keywords": ["food", "japanese"] }, - { "category": "food_and_drink", "char": "🍚", "name": "rice", "keywords": ["food", "china", "asian"] }, - { "category": "food_and_drink", "char": "🍘", "name": "rice_cracker", "keywords": ["food", "japanese"] }, - { "category": "food_and_drink", "char": "🍢", "name": "oden", "keywords": ["food", "japanese"] }, - { "category": "food_and_drink", "char": "🍡", "name": "dango", "keywords": ["food", "dessert", "sweet", "japanese", "barbecue", "meat"] }, - { "category": "food_and_drink", "char": "🍧", "name": "shaved_ice", "keywords": ["hot", "dessert", "summer"] }, - { "category": "food_and_drink", "char": "🍨", "name": "ice_cream", "keywords": ["food", "hot", "dessert"] }, - { "category": "food_and_drink", "char": "🍦", "name": "icecream", "keywords": ["food", "hot", "dessert", "summer"] }, - { "category": "food_and_drink", "char": "🥧", "name": "pie", "keywords": ["food", "dessert", "pastry"] }, - { "category": "food_and_drink", "char": "🍰", "name": "cake", "keywords": ["food", "dessert"] }, - { "category": "food_and_drink", "char": "🧁", "name": "cupcake", "keywords": ["food", "dessert", "bakery", "sweet"] }, - { "category": "food_and_drink", "char": "🥮", "name": "moon_cake", "keywords": ["food", "autumn"] }, - { "category": "food_and_drink", "char": "🎂", "name": "birthday", "keywords": ["food", "dessert", "cake"] }, - { "category": "food_and_drink", "char": "🍮", "name": "pudding", "keywords": ["dessert", "food", "custard"] }, - { "category": "food_and_drink", "char": "🍬", "name": "candy", "keywords": ["snack", "dessert", "sweet", "lolly"] }, - { "category": "food_and_drink", "char": "🍭", "name": "lollipop", "keywords": ["food", "snack", "candy", "sweet"] }, - { "category": "food_and_drink", "char": "🍫", "name": "chocolate_bar", "keywords": ["food", "snack", "dessert", "sweet"] }, - { "category": "food_and_drink", "char": "🍿", "name": "popcorn", "keywords": ["food", "movie theater", "films", "snack"] }, - { "category": "food_and_drink", "char": "🥟", "name": "dumpling", "keywords": ["food", "empanada", "pierogi", "potsticker"] }, - { "category": "food_and_drink", "char": "🍩", "name": "doughnut", "keywords": ["food", "dessert", "snack", "sweet", "donut"] }, - { "category": "food_and_drink", "char": "🍪", "name": "cookie", "keywords": ["food", "snack", "oreo", "chocolate", "sweet", "dessert"] }, - { "category": "food_and_drink", "char": "🧇", "name": "waffle", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🧆", "name": "falafel", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🧈", "name": "butter", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🦪", "name": "oyster", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🫓", "name": "flatbread", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🫔", "name": "tamale", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🫕", "name": "fondue", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🥛", "name": "milk_glass", "keywords": ["beverage", "drink", "cow"] }, - { "category": "food_and_drink", "char": "🍺", "name": "beer", "keywords": ["relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze"] }, - { "category": "food_and_drink", "char": "🍻", "name": "beers", "keywords": ["relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze"] }, - { "category": "food_and_drink", "char": "🥂", "name": "clinking_glasses", "keywords": ["beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast"] }, - { "category": "food_and_drink", "char": "🍷", "name": "wine_glass", "keywords": ["drink", "beverage", "drunk", "alcohol", "booze"] }, - { "category": "food_and_drink", "char": "🥃", "name": "tumbler_glass", "keywords": ["drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot"] }, - { "category": "food_and_drink", "char": "🍸", "name": "cocktail", "keywords": ["drink", "drunk", "alcohol", "beverage", "booze", "mojito"] }, - { "category": "food_and_drink", "char": "🍹", "name": "tropical_drink", "keywords": ["beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito"] }, - { "category": "food_and_drink", "char": "🍾", "name": "champagne", "keywords": ["drink", "wine", "bottle", "celebration"] }, - { "category": "food_and_drink", "char": "🍶", "name": "sake", "keywords": ["wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze"] }, - { "category": "food_and_drink", "char": "🍵", "name": "tea", "keywords": ["drink", "bowl", "breakfast", "green", "british"] }, - { "category": "food_and_drink", "char": "🥤", "name": "cup_with_straw", "keywords": ["drink", "soda"] }, - { "category": "food_and_drink", "char": "☕", "name": "coffee", "keywords": ["beverage", "caffeine", "latte", "espresso"] }, - { "category": "food_and_drink", "char": "🫖", "name": "teapot", "keywords": ["leafs"] }, - { "category": "food_and_drink", "char": "🧋", "name": "bubble_tea", "keywords": ["tapioca"] }, - { "category": "food_and_drink", "char": "🍼", "name": "baby_bottle", "keywords": ["food", "container", "milk"] }, - { "category": "food_and_drink", "char": "🧃", "name": "beverage_box", "keywords": ["food", "drink"] }, - { "category": "food_and_drink", "char": "🧉", "name": "mate", "keywords": ["food", "drink"] }, - { "category": "food_and_drink", "char": "🧊", "name": "ice_cube", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "🧂", "name": "salt", "keywords": ["condiment", "shaker"] }, - { "category": "food_and_drink", "char": "🥄", "name": "spoon", "keywords": ["cutlery", "kitchen", "tableware"] }, - { "category": "food_and_drink", "char": "🍴", "name": "fork_and_knife", "keywords": ["cutlery", "kitchen"] }, - { "category": "food_and_drink", "char": "🍽", "name": "plate_with_cutlery", "keywords": ["food", "eat", "meal", "lunch", "dinner", "restaurant"] }, - { "category": "food_and_drink", "char": "🥣", "name": "bowl_with_spoon", "keywords": ["food", "breakfast", "cereal", "oatmeal", "porridge"] }, - { "category": "food_and_drink", "char": "🥡", "name": "takeout_box", "keywords": ["food", "leftovers"] }, - { "category": "food_and_drink", "char": "🥢", "name": "chopsticks", "keywords": ["food"] }, - { "category": "food_and_drink", "char": "\uD83E\uDED7", "name": "pouring_liquid", "keywords": [] }, - { "category": "food_and_drink", "char": "\uD83E\uDED8", "name": "beans", "keywords": [] }, - { "category": "food_and_drink", "char": "\uD83E\uDED9", "name": "jar", "keywords": ["cookies"] }, - { "category": "activity", "char": "⚽", "name": "soccer", "keywords": ["sports", "football"] }, - { "category": "activity", "char": "🏀", "name": "basketball", "keywords": ["sports", "balls", "NBA"] }, - { "category": "activity", "char": "🏈", "name": "football", "keywords": ["sports", "balls", "NFL"] }, - { "category": "activity", "char": "⚾", "name": "baseball", "keywords": ["sports", "balls"] }, - { "category": "activity", "char": "🥎", "name": "softball", "keywords": ["sports", "balls"] }, - { "category": "activity", "char": "🎾", "name": "tennis", "keywords": ["sports", "balls", "green"] }, - { "category": "activity", "char": "🏐", "name": "volleyball", "keywords": ["sports", "balls"] }, - { "category": "activity", "char": "🏉", "name": "rugby_football", "keywords": ["sports", "team"] }, - { "category": "activity", "char": "🥏", "name": "flying_disc", "keywords": ["sports", "frisbee", "ultimate"] }, - { "category": "activity", "char": "🎱", "name": "8ball", "keywords": ["pool", "hobby", "game", "luck", "magic"] }, - { "category": "activity", "char": "⛳", "name": "golf", "keywords": ["sports", "business", "flag", "hole", "summer"] }, - { "category": "activity", "char": "🏌️♀️", "name": "golfing_woman", "keywords": ["sports", "business", "woman", "female"] }, - { "category": "activity", "char": "🏌", "name": "golfing_man", "keywords": ["sports", "business"] }, - { "category": "activity", "char": "🏓", "name": "ping_pong", "keywords": ["sports", "pingpong"] }, - { "category": "activity", "char": "🏸", "name": "badminton", "keywords": ["sports"] }, - { "category": "activity", "char": "🥅", "name": "goal_net", "keywords": ["sports"] }, - { "category": "activity", "char": "🏒", "name": "ice_hockey", "keywords": ["sports"] }, - { "category": "activity", "char": "🏑", "name": "field_hockey", "keywords": ["sports"] }, - { "category": "activity", "char": "🥍", "name": "lacrosse", "keywords": ["sports", "ball", "stick"] }, - { "category": "activity", "char": "🏏", "name": "cricket", "keywords": ["sports"] }, - { "category": "activity", "char": "🎿", "name": "ski", "keywords": ["sports", "winter", "cold", "snow"] }, - { "category": "activity", "char": "⛷", "name": "skier", "keywords": ["sports", "winter", "snow"] }, - { "category": "activity", "char": "🏂", "name": "snowboarder", "keywords": ["sports", "winter"] }, - { "category": "activity", "char": "🤺", "name": "person_fencing", "keywords": ["sports", "fencing", "sword"] }, - { "category": "activity", "char": "🤼♀️", "name": "women_wrestling", "keywords": ["sports", "wrestlers"] }, - { "category": "activity", "char": "🤼♂️", "name": "men_wrestling", "keywords": ["sports", "wrestlers"] }, - { "category": "activity", "char": "🤸♀️", "name": "woman_cartwheeling", "keywords": ["gymnastics"] }, - { "category": "activity", "char": "🤸♂️", "name": "man_cartwheeling", "keywords": ["gymnastics"] }, - { "category": "activity", "char": "🤾♀️", "name": "woman_playing_handball", "keywords": ["sports"] }, - { "category": "activity", "char": "🤾♂️", "name": "man_playing_handball", "keywords": ["sports"] }, - { "category": "activity", "char": "⛸", "name": "ice_skate", "keywords": ["sports"] }, - { "category": "activity", "char": "🥌", "name": "curling_stone", "keywords": ["sports"] }, - { "category": "activity", "char": "🛹", "name": "skateboard", "keywords": ["board"] }, - { "category": "activity", "char": "🛷", "name": "sled", "keywords": ["sleigh", "luge", "toboggan"] }, - { "category": "activity", "char": "🏹", "name": "bow_and_arrow", "keywords": ["sports"] }, - { "category": "activity", "char": "🎣", "name": "fishing_pole_and_fish", "keywords": ["food", "hobby", "summer"] }, - { "category": "activity", "char": "🥊", "name": "boxing_glove", "keywords": ["sports", "fighting"] }, - { "category": "activity", "char": "🥋", "name": "martial_arts_uniform", "keywords": ["judo", "karate", "taekwondo"] }, - { "category": "activity", "char": "🚣♀️", "name": "rowing_woman", "keywords": ["sports", "hobby", "water", "ship", "woman", "female"] }, - { "category": "activity", "char": "🚣", "name": "rowing_man", "keywords": ["sports", "hobby", "water", "ship"] }, - { "category": "activity", "char": "🧗♀️", "name": "climbing_woman", "keywords": ["sports", "hobby", "woman", "female", "rock"] }, - { "category": "activity", "char": "🧗♂️", "name": "climbing_man", "keywords": ["sports", "hobby", "man", "male", "rock"] }, - { "category": "activity", "char": "🏊♀️", "name": "swimming_woman", "keywords": ["sports", "exercise", "human", "athlete", "water", "summer", "woman", "female"] }, - { "category": "activity", "char": "🏊", "name": "swimming_man", "keywords": ["sports", "exercise", "human", "athlete", "water", "summer"] }, - { "category": "activity", "char": "🤽♀️", "name": "woman_playing_water_polo", "keywords": ["sports", "pool"] }, - { "category": "activity", "char": "🤽♂️", "name": "man_playing_water_polo", "keywords": ["sports", "pool"] }, - { "category": "activity", "char": "🧘♀️", "name": "woman_in_lotus_position", "keywords": ["woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness"] }, - { "category": "activity", "char": "🧘♂️", "name": "man_in_lotus_position", "keywords": ["man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness"] }, - { "category": "activity", "char": "🏄♀️", "name": "surfing_woman", "keywords": ["sports", "ocean", "sea", "summer", "beach", "woman", "female"] }, - { "category": "activity", "char": "🏄", "name": "surfing_man", "keywords": ["sports", "ocean", "sea", "summer", "beach"] }, - { "category": "activity", "char": "🛀", "name": "bath", "keywords": ["clean", "shower", "bathroom"] }, - { "category": "activity", "char": "⛹️♀️", "name": "basketball_woman", "keywords": ["sports", "human", "woman", "female"] }, - { "category": "activity", "char": "⛹", "name": "basketball_man", "keywords": ["sports", "human"] }, - { "category": "activity", "char": "🏋️♀️", "name": "weight_lifting_woman", "keywords": ["sports", "training", "exercise", "woman", "female"] }, - { "category": "activity", "char": "🏋", "name": "weight_lifting_man", "keywords": ["sports", "training", "exercise"] }, - { "category": "activity", "char": "🚴♀️", "name": "biking_woman", "keywords": ["sports", "bike", "exercise", "hipster", "woman", "female"] }, - { "category": "activity", "char": "🚴", "name": "biking_man", "keywords": ["sports", "bike", "exercise", "hipster"] }, - { "category": "activity", "char": "🚵♀️", "name": "mountain_biking_woman", "keywords": ["transportation", "sports", "human", "race", "bike", "woman", "female"] }, - { "category": "activity", "char": "🚵", "name": "mountain_biking_man", "keywords": ["transportation", "sports", "human", "race", "bike"] }, - { "category": "activity", "char": "🏇", "name": "horse_racing", "keywords": ["animal", "betting", "competition", "gambling", "luck"] }, - { "category": "activity", "char": "🤿", "name": "diving_mask", "keywords": ["sports"] }, - { "category": "activity", "char": "🪀", "name": "yo_yo", "keywords": ["sports"] }, - { "category": "activity", "char": "🪁", "name": "kite", "keywords": ["sports"] }, - { "category": "activity", "char": "🦺", "name": "safety_vest", "keywords": ["sports"] }, - { "category": "activity", "char": "🪡", "name": "sewing_needle", "keywords": ["fixing", "handmade", "handwork"] }, - { "category": "activity", "char": "🪢", "name": "knot", "keywords": [] }, - { "category": "activity", "char": "🕴", "name": "business_suit_levitating", "keywords": ["suit", "business", "levitate", "hover", "jump"] }, - { "category": "activity", "char": "🏆", "name": "trophy", "keywords": ["win", "award", "contest", "place", "ftw", "ceremony"] }, - { "category": "activity", "char": "🎽", "name": "running_shirt_with_sash", "keywords": ["play", "pageant"] }, - { "category": "activity", "char": "🏅", "name": "medal_sports", "keywords": ["award", "winning"] }, - { "category": "activity", "char": "🎖", "name": "medal_military", "keywords": ["award", "winning", "army"] }, - { "category": "activity", "char": "🥇", "name": "1st_place_medal", "keywords": ["award", "winning", "first"] }, - { "category": "activity", "char": "🥈", "name": "2nd_place_medal", "keywords": ["award", "second"] }, - { "category": "activity", "char": "🥉", "name": "3rd_place_medal", "keywords": ["award", "third"] }, - { "category": "activity", "char": "🎗", "name": "reminder_ribbon", "keywords": ["sports", "cause", "support", "awareness"] }, - { "category": "activity", "char": "🏵", "name": "rosette", "keywords": ["flower", "decoration", "military"] }, - { "category": "activity", "char": "🎫", "name": "ticket", "keywords": ["event", "concert", "pass"] }, - { "category": "activity", "char": "🎟", "name": "tickets", "keywords": ["sports", "concert", "entrance"] }, - { "category": "activity", "char": "🎭", "name": "performing_arts", "keywords": ["acting", "theater", "drama"] }, - { "category": "activity", "char": "🎨", "name": "art", "keywords": ["design", "paint", "draw", "colors"] }, - { "category": "activity", "char": "🎪", "name": "circus_tent", "keywords": ["festival", "carnival", "party"] }, - { "category": "activity", "char": "🤹♀️", "name": "woman_juggling", "keywords": ["juggle", "balance", "skill", "multitask"] }, - { "category": "activity", "char": "🤹♂️", "name": "man_juggling", "keywords": ["juggle", "balance", "skill", "multitask"] }, - { "category": "activity", "char": "🎤", "name": "microphone", "keywords": ["sound", "music", "PA", "sing", "talkshow"] }, - { "category": "activity", "char": "🎧", "name": "headphones", "keywords": ["music", "score", "gadgets"] }, - { "category": "activity", "char": "🎼", "name": "musical_score", "keywords": ["treble", "clef", "compose"] }, - { "category": "activity", "char": "🎹", "name": "musical_keyboard", "keywords": ["piano", "instrument", "compose"] }, - { "category": "activity", "char": "🥁", "name": "drum", "keywords": ["music", "instrument", "drumsticks", "snare"] }, - { "category": "activity", "char": "🎷", "name": "saxophone", "keywords": ["music", "instrument", "jazz", "blues"] }, - { "category": "activity", "char": "🎺", "name": "trumpet", "keywords": ["music", "brass"] }, - { "category": "activity", "char": "🎸", "name": "guitar", "keywords": ["music", "instrument"] }, - { "category": "activity", "char": "🎻", "name": "violin", "keywords": ["music", "instrument", "orchestra", "symphony"] }, - { "category": "activity", "char": "🪕", "name": "banjo", "keywords": ["music", "instrument"] }, - { "category": "activity", "char": "🪗", "name": "accordion", "keywords": ["music", "instrument"] }, - { "category": "activity", "char": "🪘", "name": "long_drum", "keywords": ["music", "instrument"] }, - { "category": "activity", "char": "🎬", "name": "clapper", "keywords": ["movie", "film", "record"] }, - { "category": "activity", "char": "🎮", "name": "video_game", "keywords": ["play", "console", "PS4", "controller"] }, - { "category": "activity", "char": "👾", "name": "space_invader", "keywords": ["game", "arcade", "play"] }, - { "category": "activity", "char": "🎯", "name": "dart", "keywords": ["game", "play", "bar", "target", "bullseye"] }, - { "category": "activity", "char": "🎲", "name": "game_die", "keywords": ["dice", "random", "tabletop", "play", "luck"] }, - { "category": "activity", "char": "♟️", "name": "chess_pawn", "keywords": ["expendable", "strategy"] }, - { "category": "activity", "char": "🎰", "name": "slot_machine", "keywords": ["bet", "gamble", "vegas", "fruit machine", "luck", "casino"] }, - { "category": "activity", "char": "🧩", "name": "jigsaw", "keywords": ["interlocking", "puzzle", "piece"] }, - { "category": "activity", "char": "🎳", "name": "bowling", "keywords": ["sports", "fun", "play"] }, - { "category": "activity", "char": "🪄", "name": "magic_wand", "keywords": ["spell", "horny", "wizardry"] }, - { "category": "activity", "char": "🪅", "name": "pinata", "keywords": ["birthday", "celebration", "fortnite", "fun"] }, - { "category": "activity", "char": "🪆", "name": "nesting_dolls", "keywords": ["russian", "handmade", "doll"] }, - { "category": "activity", "char": "\uD83E\uDEAC", "name": "hamsa", "keywords": [] }, - { "category": "activity", "char": "\uD83E\uDEA9", "name": "mirror_ball", "keywords": [] }, - { "category": "travel_and_places", "char": "🚗", "name": "red_car", "keywords": ["red", "transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚕", "name": "taxi", "keywords": ["uber", "vehicle", "cars", "transportation"] }, - { "category": "travel_and_places", "char": "🚙", "name": "blue_car", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚌", "name": "bus", "keywords": ["car", "vehicle", "transportation"] }, - { "category": "travel_and_places", "char": "🚎", "name": "trolleybus", "keywords": ["bart", "transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🏎", "name": "racing_car", "keywords": ["sports", "race", "fast", "formula", "f1"] }, - { "category": "travel_and_places", "char": "🚓", "name": "police_car", "keywords": ["vehicle", "cars", "transportation", "law", "legal", "enforcement"] }, - { "category": "travel_and_places", "char": "🚑", "name": "ambulance", "keywords": ["health", "911", "hospital"] }, - { "category": "travel_and_places", "char": "🚒", "name": "fire_engine", "keywords": ["transportation", "cars", "vehicle"] }, - { "category": "travel_and_places", "char": "🚐", "name": "minibus", "keywords": ["vehicle", "car", "transportation"] }, - { "category": "travel_and_places", "char": "🚚", "name": "truck", "keywords": ["cars", "transportation"] }, - { "category": "travel_and_places", "char": "🚛", "name": "articulated_lorry", "keywords": ["vehicle", "cars", "transportation", "express"] }, - { "category": "travel_and_places", "char": "🚜", "name": "tractor", "keywords": ["vehicle", "car", "farming", "agriculture"] }, - { "category": "travel_and_places", "char": "🛴", "name": "kick_scooter", "keywords": ["vehicle", "kick", "razor"] }, - { "category": "travel_and_places", "char": "🏍", "name": "motorcycle", "keywords": ["race", "sports", "fast"] }, - { "category": "travel_and_places", "char": "🚲", "name": "bike", "keywords": ["sports", "bicycle", "exercise", "hipster"] }, - { "category": "travel_and_places", "char": "🛵", "name": "motor_scooter", "keywords": ["vehicle", "vespa", "sasha"] }, - { "category": "travel_and_places", "char": "🦽", "name": "manual_wheelchair", "keywords": ["vehicle"] }, - { "category": "travel_and_places", "char": "🦼", "name": "motorized_wheelchair", "keywords": ["vehicle"] }, - { "category": "travel_and_places", "char": "🛺", "name": "auto_rickshaw", "keywords": ["vehicle"] }, - { "category": "travel_and_places", "char": "🪂", "name": "parachute", "keywords": ["vehicle"] }, - { "category": "travel_and_places", "char": "🚨", "name": "rotating_light", "keywords": ["police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal"] }, - { "category": "travel_and_places", "char": "🚔", "name": "oncoming_police_car", "keywords": ["vehicle", "law", "legal", "enforcement", "911"] }, - { "category": "travel_and_places", "char": "🚍", "name": "oncoming_bus", "keywords": ["vehicle", "transportation"] }, - { "category": "travel_and_places", "char": "🚘", "name": "oncoming_automobile", "keywords": ["car", "vehicle", "transportation"] }, - { "category": "travel_and_places", "char": "🚖", "name": "oncoming_taxi", "keywords": ["vehicle", "cars", "uber"] }, - { "category": "travel_and_places", "char": "🚡", "name": "aerial_tramway", "keywords": ["transportation", "vehicle", "ski"] }, - { "category": "travel_and_places", "char": "🚠", "name": "mountain_cableway", "keywords": ["transportation", "vehicle", "ski"] }, - { "category": "travel_and_places", "char": "🚟", "name": "suspension_railway", "keywords": ["vehicle", "transportation"] }, - { "category": "travel_and_places", "char": "🚃", "name": "railway_car", "keywords": ["transportation", "vehicle", "train"] }, - { "category": "travel_and_places", "char": "🚋", "name": "train", "keywords": ["transportation", "vehicle", "carriage", "public", "travel"] }, - { "category": "travel_and_places", "char": "🚝", "name": "monorail", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚄", "name": "bullettrain_side", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚅", "name": "bullettrain_front", "keywords": ["transportation", "vehicle", "speed", "fast", "public", "travel"] }, - { "category": "travel_and_places", "char": "🚈", "name": "light_rail", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚞", "name": "mountain_railway", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚂", "name": "steam_locomotive", "keywords": ["transportation", "vehicle", "train"] }, - { "category": "travel_and_places", "char": "🚆", "name": "train2", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚇", "name": "metro", "keywords": ["transportation", "blue-square", "mrt", "underground", "tube"] }, - { "category": "travel_and_places", "char": "🚊", "name": "tram", "keywords": ["transportation", "vehicle"] }, - { "category": "travel_and_places", "char": "🚉", "name": "station", "keywords": ["transportation", "vehicle", "public"] }, - { "category": "travel_and_places", "char": "🛸", "name": "flying_saucer", "keywords": ["transportation", "vehicle", "ufo"] }, - { "category": "travel_and_places", "char": "🚁", "name": "helicopter", "keywords": ["transportation", "vehicle", "fly"] }, - { "category": "travel_and_places", "char": "🛩", "name": "small_airplane", "keywords": ["flight", "transportation", "fly", "vehicle"] }, - { "category": "travel_and_places", "char": "✈️", "name": "airplane", "keywords": ["vehicle", "transportation", "flight", "fly"] }, - { "category": "travel_and_places", "char": "🛫", "name": "flight_departure", "keywords": ["airport", "flight", "landing"] }, - { "category": "travel_and_places", "char": "🛬", "name": "flight_arrival", "keywords": ["airport", "flight", "boarding"] }, - { "category": "travel_and_places", "char": "⛵", "name": "sailboat", "keywords": ["ship", "summer", "transportation", "water", "sailing"] }, - { "category": "travel_and_places", "char": "🛥", "name": "motor_boat", "keywords": ["ship"] }, - { "category": "travel_and_places", "char": "🚤", "name": "speedboat", "keywords": ["ship", "transportation", "vehicle", "summer"] }, - { "category": "travel_and_places", "char": "⛴", "name": "ferry", "keywords": ["boat", "ship", "yacht"] }, - { "category": "travel_and_places", "char": "🛳", "name": "passenger_ship", "keywords": ["yacht", "cruise", "ferry"] }, - { "category": "travel_and_places", "char": "🚀", "name": "rocket", "keywords": ["launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly"] }, - { "category": "travel_and_places", "char": "🛰", "name": "artificial_satellite", "keywords": ["communication", "gps", "orbit", "spaceflight", "NASA", "ISS"] }, - { "category": "travel_and_places", "char": "🛻", "name": "pickup_truck", "keywords": ["car"] }, - { "category": "travel_and_places", "char": "🛼", "name": "roller_skate", "keywords": [] }, - { "category": "travel_and_places", "char": "💺", "name": "seat", "keywords": ["sit", "airplane", "transport", "bus", "flight", "fly"] }, - { "category": "travel_and_places", "char": "🛶", "name": "canoe", "keywords": ["boat", "paddle", "water", "ship"] }, - { "category": "travel_and_places", "char": "⚓", "name": "anchor", "keywords": ["ship", "ferry", "sea", "boat"] }, - { "category": "travel_and_places", "char": "🚧", "name": "construction", "keywords": ["wip", "progress", "caution", "warning"] }, - { "category": "travel_and_places", "char": "⛽", "name": "fuelpump", "keywords": ["gas station", "petroleum"] }, - { "category": "travel_and_places", "char": "🚏", "name": "busstop", "keywords": ["transportation", "wait"] }, - { "category": "travel_and_places", "char": "🚦", "name": "vertical_traffic_light", "keywords": ["transportation", "driving"] }, - { "category": "travel_and_places", "char": "🚥", "name": "traffic_light", "keywords": ["transportation", "signal"] }, - { "category": "travel_and_places", "char": "🏁", "name": "checkered_flag", "keywords": ["contest", "finishline", "race", "gokart"] }, - { "category": "travel_and_places", "char": "🚢", "name": "ship", "keywords": ["transportation", "titanic", "deploy"] }, - { "category": "travel_and_places", "char": "🎡", "name": "ferris_wheel", "keywords": ["photo", "carnival", "londoneye"] }, - { "category": "travel_and_places", "char": "🎢", "name": "roller_coaster", "keywords": ["carnival", "playground", "photo", "fun"] }, - { "category": "travel_and_places", "char": "🎠", "name": "carousel_horse", "keywords": ["photo", "carnival"] }, - { "category": "travel_and_places", "char": "🏗", "name": "building_construction", "keywords": ["wip", "working", "progress"] }, - { "category": "travel_and_places", "char": "🌁", "name": "foggy", "keywords": ["photo", "mountain"] }, - { "category": "travel_and_places", "char": "🏭", "name": "factory", "keywords": ["building", "industry", "pollution", "smoke"] }, - { "category": "travel_and_places", "char": "⛲", "name": "fountain", "keywords": ["photo", "summer", "water", "fresh"] }, - { "category": "travel_and_places", "char": "🎑", "name": "rice_scene", "keywords": ["photo", "japan", "asia", "tsukimi"] }, - { "category": "travel_and_places", "char": "⛰", "name": "mountain", "keywords": ["photo", "nature", "environment"] }, - { "category": "travel_and_places", "char": "🏔", "name": "mountain_snow", "keywords": ["photo", "nature", "environment", "winter", "cold"] }, - { "category": "travel_and_places", "char": "🗻", "name": "mount_fuji", "keywords": ["photo", "mountain", "nature", "japanese"] }, - { "category": "travel_and_places", "char": "🌋", "name": "volcano", "keywords": ["photo", "nature", "disaster"] }, - { "category": "travel_and_places", "char": "🗾", "name": "japan", "keywords": ["nation", "country", "japanese", "asia"] }, - { "category": "travel_and_places", "char": "🏕", "name": "camping", "keywords": ["photo", "outdoors", "tent"] }, - { "category": "travel_and_places", "char": "⛺", "name": "tent", "keywords": ["photo", "camping", "outdoors"] }, - { "category": "travel_and_places", "char": "🏞", "name": "national_park", "keywords": ["photo", "environment", "nature"] }, - { "category": "travel_and_places", "char": "🛣", "name": "motorway", "keywords": ["road", "cupertino", "interstate", "highway"] }, - { "category": "travel_and_places", "char": "🛤", "name": "railway_track", "keywords": ["train", "transportation"] }, - { "category": "travel_and_places", "char": "🌅", "name": "sunrise", "keywords": ["morning", "view", "vacation", "photo"] }, - { "category": "travel_and_places", "char": "🌄", "name": "sunrise_over_mountains", "keywords": ["view", "vacation", "photo"] }, - { "category": "travel_and_places", "char": "🏜", "name": "desert", "keywords": ["photo", "warm", "saharah"] }, - { "category": "travel_and_places", "char": "🏖", "name": "beach_umbrella", "keywords": ["weather", "summer", "sunny", "sand", "mojito"] }, - { "category": "travel_and_places", "char": "🏝", "name": "desert_island", "keywords": ["photo", "tropical", "mojito"] }, - { "category": "travel_and_places", "char": "🌇", "name": "city_sunrise", "keywords": ["photo", "good morning", "dawn"] }, - { "category": "travel_and_places", "char": "🌆", "name": "city_sunset", "keywords": ["photo", "evening", "sky", "buildings"] }, - { "category": "travel_and_places", "char": "🏙", "name": "cityscape", "keywords": ["photo", "night life", "urban"] }, - { "category": "travel_and_places", "char": "🌃", "name": "night_with_stars", "keywords": ["evening", "city", "downtown"] }, - { "category": "travel_and_places", "char": "🌉", "name": "bridge_at_night", "keywords": ["photo", "sanfrancisco"] }, - { "category": "travel_and_places", "char": "🌌", "name": "milky_way", "keywords": ["photo", "space", "stars"] }, - { "category": "travel_and_places", "char": "🌠", "name": "stars", "keywords": ["night", "photo"] }, - { "category": "travel_and_places", "char": "🎇", "name": "sparkler", "keywords": ["stars", "night", "shine"] }, - { "category": "travel_and_places", "char": "🎆", "name": "fireworks", "keywords": ["photo", "festival", "carnival", "congratulations"] }, - { "category": "travel_and_places", "char": "🌈", "name": "rainbow", "keywords": ["nature", "happy", "unicorn_face", "photo", "sky", "spring"] }, - { "category": "travel_and_places", "char": "🏘", "name": "houses", "keywords": ["buildings", "photo"] }, - { "category": "travel_and_places", "char": "🏰", "name": "european_castle", "keywords": ["building", "royalty", "history"] }, - { "category": "travel_and_places", "char": "🏯", "name": "japanese_castle", "keywords": ["photo", "building"] }, - { "category": "travel_and_places", "char": "🗼", "name": "tokyo_tower", "keywords": ["photo", "japanese"] }, - { "category": "travel_and_places", "char": "", "name": "shibuya_109", "keywords": ["photo", "japanese"] }, - { "category": "travel_and_places", "char": "🏟", "name": "stadium", "keywords": ["photo", "place", "sports", "concert", "venue"] }, - { "category": "travel_and_places", "char": "🗽", "name": "statue_of_liberty", "keywords": ["american", "newyork"] }, - { "category": "travel_and_places", "char": "🏠", "name": "house", "keywords": ["building", "home"] }, - { "category": "travel_and_places", "char": "🏡", "name": "house_with_garden", "keywords": ["home", "plant", "nature"] }, - { "category": "travel_and_places", "char": "🏚", "name": "derelict_house", "keywords": ["abandon", "evict", "broken", "building"] }, - { "category": "travel_and_places", "char": "🏢", "name": "office", "keywords": ["building", "bureau", "work"] }, - { "category": "travel_and_places", "char": "🏬", "name": "department_store", "keywords": ["building", "shopping", "mall"] }, - { "category": "travel_and_places", "char": "🏣", "name": "post_office", "keywords": ["building", "envelope", "communication"] }, - { "category": "travel_and_places", "char": "🏤", "name": "european_post_office", "keywords": ["building", "email"] }, - { "category": "travel_and_places", "char": "🏥", "name": "hospital", "keywords": ["building", "health", "surgery", "doctor"] }, - { "category": "travel_and_places", "char": "🏦", "name": "bank", "keywords": ["building", "money", "sales", "cash", "business", "enterprise"] }, - { "category": "travel_and_places", "char": "🏨", "name": "hotel", "keywords": ["building", "accomodation", "checkin"] }, - { "category": "travel_and_places", "char": "🏪", "name": "convenience_store", "keywords": ["building", "shopping", "groceries"] }, - { "category": "travel_and_places", "char": "🏫", "name": "school", "keywords": ["building", "student", "education", "learn", "teach"] }, - { "category": "travel_and_places", "char": "🏩", "name": "love_hotel", "keywords": ["like", "affection", "dating"] }, - { "category": "travel_and_places", "char": "💒", "name": "wedding", "keywords": ["love", "like", "affection", "couple", "marriage", "bride", "groom"] }, - { "category": "travel_and_places", "char": "🏛", "name": "classical_building", "keywords": ["art", "culture", "history"] }, - { "category": "travel_and_places", "char": "⛪", "name": "church", "keywords": ["building", "religion", "christ"] }, - { "category": "travel_and_places", "char": "🕌", "name": "mosque", "keywords": ["islam", "worship", "minaret"] }, - { "category": "travel_and_places", "char": "🕍", "name": "synagogue", "keywords": ["judaism", "worship", "temple", "jewish"] }, - { "category": "travel_and_places", "char": "🕋", "name": "kaaba", "keywords": ["mecca", "mosque", "islam"] }, - { "category": "travel_and_places", "char": "⛩", "name": "shinto_shrine", "keywords": ["temple", "japan", "kyoto"] }, - { "category": "travel_and_places", "char": "🛕", "name": "hindu_temple", "keywords": ["temple"] }, - { "category": "travel_and_places", "char": "🪨", "name": "rock", "keywords": ["ressource"] }, - { "category": "travel_and_places", "char": "🪵", "name": "wood", "keywords": ["ressource"] }, - { "category": "travel_and_places", "char": "🛖", "name": "hut", "keywords": ["forest", "woods"] }, - { "category": "travel_and_places", "char": "\uD83D\uDEDD", "name": "playground_slide", "keywords": [] }, - { "category": "travel_and_places", "char": "\uD83D\uDEDE", "name": "wheel", "keywords": [] }, - { "category": "travel_and_places", "char": "\uD83D\uDEDF", "name": "ring_buoy", "keywords": ["ocean"] }, - { "category": "objects", "char": "⌚", "name": "watch", "keywords": ["time", "accessories"] }, - { "category": "objects", "char": "📱", "name": "iphone", "keywords": ["technology", "apple", "gadgets", "dial"] }, - { "category": "objects", "char": "📲", "name": "calling", "keywords": ["iphone", "incoming"] }, - { "category": "objects", "char": "💻", "name": "computer", "keywords": ["technology", "laptop", "screen", "display", "monitor"] }, - { "category": "objects", "char": "⌨", "name": "keyboard", "keywords": ["technology", "computer", "type", "input", "text"] }, - { "category": "objects", "char": "🖥", "name": "desktop_computer", "keywords": ["technology", "computing", "screen"] }, - { "category": "objects", "char": "🖨", "name": "printer", "keywords": ["paper", "ink"] }, - { "category": "objects", "char": "🖱", "name": "computer_mouse", "keywords": ["click"] }, - { "category": "objects", "char": "🖲", "name": "trackball", "keywords": ["technology", "trackpad"] }, - { "category": "objects", "char": "🕹", "name": "joystick", "keywords": ["game", "play"] }, - { "category": "objects", "char": "🗜", "name": "clamp", "keywords": ["tool"] }, - { "category": "objects", "char": "💽", "name": "minidisc", "keywords": ["technology", "record", "data", "disk", "90s"] }, - { "category": "objects", "char": "💾", "name": "floppy_disk", "keywords": ["oldschool", "technology", "save", "90s", "80s"] }, - { "category": "objects", "char": "💿", "name": "cd", "keywords": ["technology", "dvd", "disk", "disc", "90s"] }, - { "category": "objects", "char": "📀", "name": "dvd", "keywords": ["cd", "disk", "disc"] }, - { "category": "objects", "char": "📼", "name": "vhs", "keywords": ["record", "video", "oldschool", "90s", "80s"] }, - { "category": "objects", "char": "📷", "name": "camera", "keywords": ["gadgets", "photography"] }, - { "category": "objects", "char": "📸", "name": "camera_flash", "keywords": ["photography", "gadgets"] }, - { "category": "objects", "char": "📹", "name": "video_camera", "keywords": ["film", "record"] }, - { "category": "objects", "char": "🎥", "name": "movie_camera", "keywords": ["film", "record"] }, - { "category": "objects", "char": "📽", "name": "film_projector", "keywords": ["video", "tape", "record", "movie"] }, - { "category": "objects", "char": "🎞", "name": "film_strip", "keywords": ["movie"] }, - { "category": "objects", "char": "📞", "name": "telephone_receiver", "keywords": ["technology", "communication", "dial"] }, - { "category": "objects", "char": "☎️", "name": "phone", "keywords": ["technology", "communication", "dial", "telephone"] }, - { "category": "objects", "char": "📟", "name": "pager", "keywords": ["bbcall", "oldschool", "90s"] }, - { "category": "objects", "char": "📠", "name": "fax", "keywords": ["communication", "technology"] }, - { "category": "objects", "char": "📺", "name": "tv", "keywords": ["technology", "program", "oldschool", "show", "television"] }, - { "category": "objects", "char": "📻", "name": "radio", "keywords": ["communication", "music", "podcast", "program"] }, - { "category": "objects", "char": "🎙", "name": "studio_microphone", "keywords": ["sing", "recording", "artist", "talkshow"] }, - { "category": "objects", "char": "🎚", "name": "level_slider", "keywords": ["scale"] }, - { "category": "objects", "char": "🎛", "name": "control_knobs", "keywords": ["dial"] }, - { "category": "objects", "char": "🧭", "name": "compass", "keywords": ["magnetic", "navigation", "orienteering"] }, - { "category": "objects", "char": "⏱", "name": "stopwatch", "keywords": ["time", "deadline"] }, - { "category": "objects", "char": "⏲", "name": "timer_clock", "keywords": ["alarm", "time"] }, - { "category": "objects", "char": "⏰", "name": "alarm_clock", "keywords": ["time", "wake"] }, - { "category": "objects", "char": "🕰", "name": "mantelpiece_clock", "keywords": ["time"] }, - { "category": "objects", "char": "⏳", "name": "hourglass_flowing_sand", "keywords": ["time", "clock", "oldschool", "limit", "exam", "quiz", "test", "countdown"] }, - { "category": "objects", "char": "⌛", "name": "hourglass", "keywords": ["time", "clock", "oldschool", "limit", "exam", "quiz", "test", "countdown"] }, - { "category": "objects", "char": "📡", "name": "satellite", "keywords": ["communication", "future", "radio", "space"] }, - { "category": "objects", "char": "🔋", "name": "battery", "keywords": ["power", "energy", "sustain"] }, - { "category": "objects", "char": "\uD83E\uDEAB", "name": "battery", "keywords": ["power", "energy", "sustain"] }, - { "category": "objects", "char": "🔌", "name": "electric_plug", "keywords": ["charger", "power"] }, - { "category": "objects", "char": "💡", "name": "bulb", "keywords": ["light", "electricity", "idea"] }, - { "category": "objects", "char": "🔦", "name": "flashlight", "keywords": ["dark", "camping", "sight", "night"] }, - { "category": "objects", "char": "🕯", "name": "candle", "keywords": ["fire", "wax"] }, - { "category": "objects", "char": "🧯", "name": "fire_extinguisher", "keywords": ["quench"] }, - { "category": "objects", "char": "🗑", "name": "wastebasket", "keywords": ["bin", "trash", "rubbish", "garbage", "toss"] }, - { "category": "objects", "char": "🛢", "name": "oil_drum", "keywords": ["barrell"] }, - { "category": "objects", "char": "💸", "name": "money_with_wings", "keywords": ["dollar", "bills", "payment", "sale"] }, - { "category": "objects", "char": "💵", "name": "dollar", "keywords": ["money", "sales", "bill", "currency"] }, - { "category": "objects", "char": "💴", "name": "yen", "keywords": ["money", "sales", "japanese", "dollar", "currency"] }, - { "category": "objects", "char": "💶", "name": "euro", "keywords": ["money", "sales", "dollar", "currency"] }, - { "category": "objects", "char": "💷", "name": "pound", "keywords": ["british", "sterling", "money", "sales", "bills", "uk", "england", "currency"] }, - { "category": "objects", "char": "💰", "name": "moneybag", "keywords": ["dollar", "payment", "coins", "sale"] }, - { "category": "objects", "char": "🪙", "name": "coin", "keywords": ["dollar", "payment", "coins", "sale"] }, - { "category": "objects", "char": "💳", "name": "credit_card", "keywords": ["money", "sales", "dollar", "bill", "payment", "shopping"] }, - { "category": "objects", "char": "\uD83E\uDEAB", "name": "identification_card", "keywords": ["id", "license", "drivers"] }, - { "category": "objects", "char": "💎", "name": "gem", "keywords": ["blue", "ruby", "diamond", "jewelry"] }, - { "category": "objects", "char": "⚖", "name": "balance_scale", "keywords": ["law", "fairness", "weight"] }, - { "category": "objects", "char": "🧰", "name": "toolbox", "keywords": ["tools", "diy", "fix", "maintainer", "mechanic"] }, - { "category": "objects", "char": "🔧", "name": "wrench", "keywords": ["tools", "diy", "ikea", "fix", "maintainer"] }, - { "category": "objects", "char": "🔨", "name": "hammer", "keywords": ["tools", "build", "create"] }, - { "category": "objects", "char": "⚒", "name": "hammer_and_pick", "keywords": ["tools", "build", "create"] }, - { "category": "objects", "char": "🛠", "name": "hammer_and_wrench", "keywords": ["tools", "build", "create"] }, - { "category": "objects", "char": "⛏", "name": "pick", "keywords": ["tools", "dig"] }, - { "category": "objects", "char": "🪓", "name": "axe", "keywords": ["tools"] }, - { "category": "objects", "char": "🦯", "name": "probing_cane", "keywords": ["tools"] }, - { "category": "objects", "char": "🔩", "name": "nut_and_bolt", "keywords": ["handy", "tools", "fix"] }, - { "category": "objects", "char": "⚙", "name": "gear", "keywords": ["cog"] }, - { "category": "objects", "char": "🪃", "name": "boomerang", "keywords": ["tool"] }, - { "category": "objects", "char": "🪚", "name": "carpentry_saw", "keywords": ["tool"] }, - { "category": "objects", "char": "🪛", "name": "screwdriver", "keywords": ["tool"] }, - { "category": "objects", "char": "🪝", "name": "hook", "keywords": ["tool"] }, - { "category": "objects", "char": "🪜", "name": "ladder", "keywords": ["tool"] }, - { "category": "objects", "char": "🧱", "name": "brick", "keywords": ["bricks"] }, - { "category": "objects", "char": "⛓", "name": "chains", "keywords": ["lock", "arrest"] }, - { "category": "objects", "char": "🧲", "name": "magnet", "keywords": ["attraction", "magnetic"] }, - { "category": "objects", "char": "🔫", "name": "gun", "keywords": ["violence", "weapon", "pistol", "revolver"] }, - { "category": "objects", "char": "💣", "name": "bomb", "keywords": ["boom", "explode", "explosion", "terrorism"] }, - { "category": "objects", "char": "🧨", "name": "firecracker", "keywords": ["dynamite", "boom", "explode", "explosion", "explosive"] }, - { "category": "objects", "char": "🔪", "name": "hocho", "keywords": ["knife", "blade", "cutlery", "kitchen", "weapon"] }, - { "category": "objects", "char": "🗡", "name": "dagger", "keywords": ["weapon"] }, - { "category": "objects", "char": "⚔", "name": "crossed_swords", "keywords": ["weapon"] }, - { "category": "objects", "char": "🛡", "name": "shield", "keywords": ["protection", "security"] }, - { "category": "objects", "char": "🚬", "name": "smoking", "keywords": ["kills", "tobacco", "cigarette", "joint", "smoke"] }, - { "category": "objects", "char": "☠", "name": "skull_and_crossbones", "keywords": ["poison", "danger", "deadly", "scary", "death", "pirate", "evil"] }, - { "category": "objects", "char": "⚰", "name": "coffin", "keywords": ["vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box"] }, - { "category": "objects", "char": "⚱", "name": "funeral_urn", "keywords": ["dead", "die", "death", "rip", "ashes"] }, - { "category": "objects", "char": "🏺", "name": "amphora", "keywords": ["vase", "jar"] }, - { "category": "objects", "char": "🔮", "name": "crystal_ball", "keywords": ["disco", "party", "magic", "circus", "fortune_teller"] }, - { "category": "objects", "char": "📿", "name": "prayer_beads", "keywords": ["dhikr", "religious"] }, - { "category": "objects", "char": "🧿", "name": "nazar_amulet", "keywords": ["bead", "charm"] }, - { "category": "objects", "char": "💈", "name": "barber", "keywords": ["hair", "salon", "style"] }, - { "category": "objects", "char": "⚗", "name": "alembic", "keywords": ["distilling", "science", "experiment", "chemistry"] }, - { "category": "objects", "char": "🔭", "name": "telescope", "keywords": ["stars", "space", "zoom", "science", "astronomy"] }, - { "category": "objects", "char": "🔬", "name": "microscope", "keywords": ["laboratory", "experiment", "zoomin", "science", "study"] }, - { "category": "objects", "char": "🕳", "name": "hole", "keywords": ["embarrassing"] }, - { "category": "objects", "char": "💊", "name": "pill", "keywords": ["health", "medicine", "doctor", "pharmacy", "drug"] }, - { "category": "objects", "char": "💉", "name": "syringe", "keywords": ["health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse"] }, - { "category": "objects", "char": "🩸", "name": "drop_of_blood", "keywords": ["health", "hospital", "medicine", "needle", "doctor", "nurse"] }, - { "category": "objects", "char": "🩹", "name": "adhesive_bandage", "keywords": ["health", "hospital", "medicine", "needle", "doctor", "nurse"] }, - { "category": "objects", "char": "🩺", "name": "stethoscope", "keywords": ["health", "hospital", "medicine", "needle", "doctor", "nurse"] }, - { "category": "objects", "char": "🪒", "name": "razor", "keywords": ["health"] }, - { "category": "objects", "char": "\uD83E\uDE7B", "name": "xray", "keywords": [] }, - { "category": "objects", "char": "\uD83E\uDE7C", "name": "crutch", "keywords": [] }, - { "category": "objects", "char": "🧬", "name": "dna", "keywords": ["biologist", "genetics", "life"] }, - { "category": "objects", "char": "🧫", "name": "petri_dish", "keywords": ["bacteria", "biology", "culture", "lab"] }, - { "category": "objects", "char": "🧪", "name": "test_tube", "keywords": ["chemistry", "experiment", "lab", "science"] }, - { "category": "objects", "char": "🌡", "name": "thermometer", "keywords": ["weather", "temperature", "hot", "cold"] }, - { "category": "objects", "char": "🧹", "name": "broom", "keywords": ["cleaning", "sweeping", "witch"] }, - { "category": "objects", "char": "🧺", "name": "basket", "keywords": ["laundry"] }, - { "category": "objects", "char": "🧻", "name": "toilet_paper", "keywords": ["roll", "paper"] }, - { "category": "objects", "char": "🏷", "name": "label", "keywords": ["sale", "tag"] }, - { "category": "objects", "char": "🔖", "name": "bookmark", "keywords": ["favorite", "label", "save"] }, - { "category": "objects", "char": "🚽", "name": "toilet", "keywords": ["restroom", "wc", "washroom", "bathroom", "potty"] }, - { "category": "objects", "char": "🚿", "name": "shower", "keywords": ["clean", "water", "bathroom"] }, - { "category": "objects", "char": "🛁", "name": "bathtub", "keywords": ["clean", "shower", "bathroom"] }, - { "category": "objects", "char": "🧼", "name": "soap", "keywords": ["bar", "bathing", "cleaning", "lather"] }, - { "category": "objects", "char": "🧽", "name": "sponge", "keywords": ["absorbing", "cleaning", "porous"] }, - { "category": "objects", "char": "🧴", "name": "lotion_bottle", "keywords": ["moisturizer", "sunscreen"] }, - { "category": "objects", "char": "🔑", "name": "key", "keywords": ["lock", "door", "password"] }, - { "category": "objects", "char": "🗝", "name": "old_key", "keywords": ["lock", "door", "password"] }, - { "category": "objects", "char": "🛋", "name": "couch_and_lamp", "keywords": ["read", "chill"] }, - { "category": "objects", "char": "🪔", "name": "diya_Lamp", "keywords": ["light", "oil"] }, - { "category": "objects", "char": "🛌", "name": "sleeping_bed", "keywords": ["bed", "rest"] }, - { "category": "objects", "char": "🛏", "name": "bed", "keywords": ["sleep", "rest"] }, - { "category": "objects", "char": "🚪", "name": "door", "keywords": ["house", "entry", "exit"] }, - { "category": "objects", "char": "🪑", "name": "chair", "keywords": ["house", "desk"] }, - { "category": "objects", "char": "🛎", "name": "bellhop_bell", "keywords": ["service"] }, - { "category": "objects", "char": "🧸", "name": "teddy_bear", "keywords": ["plush", "stuffed"] }, - { "category": "objects", "char": "🖼", "name": "framed_picture", "keywords": ["photography"] }, - { "category": "objects", "char": "🗺", "name": "world_map", "keywords": ["location", "direction"] }, - { "category": "objects", "char": "🛗", "name": "elevator", "keywords": ["household"] }, - { "category": "objects", "char": "🪞", "name": "mirror", "keywords": ["household"] }, - { "category": "objects", "char": "🪟", "name": "window", "keywords": ["household"] }, - { "category": "objects", "char": "🪠", "name": "plunger", "keywords": ["household"] }, - { "category": "objects", "char": "🪤", "name": "mouse_trap", "keywords": ["household"] }, - { "category": "objects", "char": "🪣", "name": "bucket", "keywords": ["household"] }, - { "category": "objects", "char": "🪥", "name": "toothbrush", "keywords": ["household"] }, - { "category": "objects", "char": "\uD83E\uDEE7", "name": "bubbles", "keywords": ["ocean", "underwater"] }, - { "category": "objects", "char": "⛱", "name": "parasol_on_ground", "keywords": ["weather", "summer"] }, - { "category": "objects", "char": "🗿", "name": "moyai", "keywords": ["rock", "easter island", "moai"] }, - { "category": "objects", "char": "🛍", "name": "shopping", "keywords": ["mall", "buy", "purchase"] }, - { "category": "objects", "char": "🛒", "name": "shopping_cart", "keywords": ["trolley"] }, - { "category": "objects", "char": "🎈", "name": "balloon", "keywords": ["party", "celebration", "birthday", "circus"] }, - { "category": "objects", "char": "🎏", "name": "flags", "keywords": ["fish", "japanese", "koinobori", "carp", "banner"] }, - { "category": "objects", "char": "🎀", "name": "ribbon", "keywords": ["decoration", "pink", "girl", "bowtie"] }, - { "category": "objects", "char": "🎁", "name": "gift", "keywords": ["present", "birthday", "christmas", "xmas"] }, - { "category": "objects", "char": "🎊", "name": "confetti_ball", "keywords": ["festival", "party", "birthday", "circus"] }, - { "category": "objects", "char": "🎉", "name": "tada", "keywords": ["party", "congratulations", "birthday", "magic", "circus", "celebration"] }, - { "category": "objects", "char": "🎎", "name": "dolls", "keywords": ["japanese", "toy", "kimono"] }, - { "category": "objects", "char": "🎐", "name": "wind_chime", "keywords": ["nature", "ding", "spring", "bell"] }, - { "category": "objects", "char": "🎌", "name": "crossed_flags", "keywords": ["japanese", "nation", "country", "border"] }, - { "category": "objects", "char": "🏮", "name": "izakaya_lantern", "keywords": ["light", "paper", "halloween", "spooky"] }, - { "category": "objects", "char": "🧧", "name": "red_envelope", "keywords": ["gift"] }, - { "category": "objects", "char": "✉️", "name": "email", "keywords": ["letter", "postal", "inbox", "communication"] }, - { "category": "objects", "char": "📩", "name": "envelope_with_arrow", "keywords": ["email", "communication"] }, - { "category": "objects", "char": "📨", "name": "incoming_envelope", "keywords": ["email", "inbox"] }, - { "category": "objects", "char": "📧", "name": "e-mail", "keywords": ["communication", "inbox"] }, - { "category": "objects", "char": "💌", "name": "love_letter", "keywords": ["email", "like", "affection", "envelope", "valentines"] }, - { "category": "objects", "char": "📮", "name": "postbox", "keywords": ["email", "letter", "envelope"] }, - { "category": "objects", "char": "📪", "name": "mailbox_closed", "keywords": ["email", "communication", "inbox"] }, - { "category": "objects", "char": "📫", "name": "mailbox", "keywords": ["email", "inbox", "communication"] }, - { "category": "objects", "char": "📬", "name": "mailbox_with_mail", "keywords": ["email", "inbox", "communication"] }, - { "category": "objects", "char": "📭", "name": "mailbox_with_no_mail", "keywords": ["email", "inbox"] }, - { "category": "objects", "char": "📦", "name": "package", "keywords": ["mail", "gift", "cardboard", "box", "moving"] }, - { "category": "objects", "char": "📯", "name": "postal_horn", "keywords": ["instrument", "music"] }, - { "category": "objects", "char": "📥", "name": "inbox_tray", "keywords": ["email", "documents"] }, - { "category": "objects", "char": "📤", "name": "outbox_tray", "keywords": ["inbox", "email"] }, - { "category": "objects", "char": "📜", "name": "scroll", "keywords": ["documents", "ancient", "history", "paper"] }, - { "category": "objects", "char": "📃", "name": "page_with_curl", "keywords": ["documents", "office", "paper"] }, - { "category": "objects", "char": "📑", "name": "bookmark_tabs", "keywords": ["favorite", "save", "order", "tidy"] }, - { "category": "objects", "char": "🧾", "name": "receipt", "keywords": ["accounting", "expenses"] }, - { "category": "objects", "char": "📊", "name": "bar_chart", "keywords": ["graph", "presentation", "stats"] }, - { "category": "objects", "char": "📈", "name": "chart_with_upwards_trend", "keywords": ["graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success"] }, - { "category": "objects", "char": "📉", "name": "chart_with_downwards_trend", "keywords": ["graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure"] }, - { "category": "objects", "char": "📄", "name": "page_facing_up", "keywords": ["documents", "office", "paper", "information"] }, - { "category": "objects", "char": "📅", "name": "date", "keywords": ["calendar", "schedule"] }, - { "category": "objects", "char": "📆", "name": "calendar", "keywords": ["schedule", "date", "planning"] }, - { "category": "objects", "char": "🗓", "name": "spiral_calendar", "keywords": ["date", "schedule", "planning"] }, - { "category": "objects", "char": "📇", "name": "card_index", "keywords": ["business", "stationery"] }, - { "category": "objects", "char": "🗃", "name": "card_file_box", "keywords": ["business", "stationery"] }, - { "category": "objects", "char": "🗳", "name": "ballot_box", "keywords": ["election", "vote"] }, - { "category": "objects", "char": "🗄", "name": "file_cabinet", "keywords": ["filing", "organizing"] }, - { "category": "objects", "char": "📋", "name": "clipboard", "keywords": ["stationery", "documents"] }, - { "category": "objects", "char": "🗒", "name": "spiral_notepad", "keywords": ["memo", "stationery"] }, - { "category": "objects", "char": "📁", "name": "file_folder", "keywords": ["documents", "business", "office"] }, - { "category": "objects", "char": "📂", "name": "open_file_folder", "keywords": ["documents", "load"] }, - { "category": "objects", "char": "🗂", "name": "card_index_dividers", "keywords": ["organizing", "business", "stationery"] }, - { "category": "objects", "char": "🗞", "name": "newspaper_roll", "keywords": ["press", "headline"] }, - { "category": "objects", "char": "📰", "name": "newspaper", "keywords": ["press", "headline"] }, - { "category": "objects", "char": "📓", "name": "notebook", "keywords": ["stationery", "record", "notes", "paper", "study"] }, - { "category": "objects", "char": "📕", "name": "closed_book", "keywords": ["read", "library", "knowledge", "textbook", "learn"] }, - { "category": "objects", "char": "📗", "name": "green_book", "keywords": ["read", "library", "knowledge", "study"] }, - { "category": "objects", "char": "📘", "name": "blue_book", "keywords": ["read", "library", "knowledge", "learn", "study"] }, - { "category": "objects", "char": "📙", "name": "orange_book", "keywords": ["read", "library", "knowledge", "textbook", "study"] }, - { "category": "objects", "char": "📔", "name": "notebook_with_decorative_cover", "keywords": ["classroom", "notes", "record", "paper", "study"] }, - { "category": "objects", "char": "📒", "name": "ledger", "keywords": ["notes", "paper"] }, - { "category": "objects", "char": "📚", "name": "books", "keywords": ["literature", "library", "study"] }, - { "category": "objects", "char": "📖", "name": "open_book", "keywords": ["book", "read", "library", "knowledge", "literature", "learn", "study"] }, - { "category": "objects", "char": "🧷", "name": "safety_pin", "keywords": ["diaper"] }, - { "category": "objects", "char": "🔗", "name": "link", "keywords": ["rings", "url"] }, - { "category": "objects", "char": "📎", "name": "paperclip", "keywords": ["documents", "stationery"] }, - { "category": "objects", "char": "🖇", "name": "paperclips", "keywords": ["documents", "stationery"] }, - { "category": "objects", "char": "✂️", "name": "scissors", "keywords": ["stationery", "cut"] }, - { "category": "objects", "char": "📐", "name": "triangular_ruler", "keywords": ["stationery", "math", "architect", "sketch"] }, - { "category": "objects", "char": "📏", "name": "straight_ruler", "keywords": ["stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch"] }, - { "category": "objects", "char": "🧮", "name": "abacus", "keywords": ["calculation"] }, - { "category": "objects", "char": "📌", "name": "pushpin", "keywords": ["stationery", "mark", "here"] }, - { "category": "objects", "char": "📍", "name": "round_pushpin", "keywords": ["stationery", "location", "map", "here"] }, - { "category": "objects", "char": "🚩", "name": "triangular_flag_on_post", "keywords": ["mark", "milestone", "place"] }, - { "category": "objects", "char": "🏳", "name": "white_flag", "keywords": ["losing", "loser", "lost", "surrender", "give up", "fail"] }, - { "category": "objects", "char": "🏴", "name": "black_flag", "keywords": ["pirate"] }, - { "category": "objects", "char": "🏳️🌈", "name": "rainbow_flag", "keywords": ["flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual"] }, - { "category": "objects", "char": "🏳️⚧️", "name": "transgender_flag", "keywords": ["flag", "transgender", "pride"] }, - { "category": "objects", "char": "🔐", "name": "closed_lock_with_key", "keywords": ["security", "privacy"] }, - { "category": "objects", "char": "🔒", "name": "lock", "keywords": ["security", "password", "padlock"] }, - { "category": "objects", "char": "🔓", "name": "unlock", "keywords": ["privacy", "security"] }, - { "category": "objects", "char": "🔏", "name": "lock_with_ink_pen", "keywords": ["security", "secret"] }, - { "category": "objects", "char": "🖊", "name": "pen", "keywords": ["stationery", "writing", "write"] }, - { "category": "objects", "char": "🖋", "name": "fountain_pen", "keywords": ["stationery", "writing", "write"] }, - { "category": "objects", "char": "✒️", "name": "black_nib", "keywords": ["pen", "stationery", "writing", "write"] }, - { "category": "objects", "char": "📝", "name": "memo", "keywords": ["write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose"] }, - { "category": "objects", "char": "✏️", "name": "pencil2", "keywords": ["stationery", "write", "paper", "writing", "school", "study"] }, - { "category": "objects", "char": "🖍", "name": "crayon", "keywords": ["drawing", "creativity"] }, - { "category": "objects", "char": "🖌", "name": "paintbrush", "keywords": ["drawing", "creativity", "art"] }, - { "category": "objects", "char": "🔍", "name": "mag", "keywords": ["search", "zoom", "find", "detective"] }, - { "category": "objects", "char": "🔎", "name": "mag_right", "keywords": ["search", "zoom", "find", "detective"] }, - { "category": "objects", "char": "🪦", "name": "headstone", "keywords": ["tombstone", "death"] }, - { "category": "objects", "char": "🪧", "name": "placard", "keywords": ["sign", "description"] }, - { "category": "symbols", "char": "💯", "name": "100", "keywords": ["score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred"] }, - { "category": "symbols", "char": "🔢", "name": "1234", "keywords": ["numbers", "blue-square"] }, - { "category": "symbols", "char": "❤️", "name": "heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "🧡", "name": "orange_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💛", "name": "yellow_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💚", "name": "green_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💙", "name": "blue_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💜", "name": "purple_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "🤎", "name": "brown_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "🖤", "name": "black_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "🤍", "name": "white_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💔", "name": "broken_heart", "keywords": ["sad", "sorry", "break", "heart", "heartbreak"] }, - { "category": "symbols", "char": "❣", "name": "heavy_heart_exclamation", "keywords": ["decoration", "love"] }, - { "category": "symbols", "char": "💕", "name": "two_hearts", "keywords": ["love", "like", "affection", "valentines", "heart"] }, - { "category": "symbols", "char": "💞", "name": "revolving_hearts", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💓", "name": "heartbeat", "keywords": ["love", "like", "affection", "valentines", "pink", "heart"] }, - { "category": "symbols", "char": "💗", "name": "heartpulse", "keywords": ["like", "love", "affection", "valentines", "pink"] }, - { "category": "symbols", "char": "💖", "name": "sparkling_heart", "keywords": ["love", "like", "affection", "valentines"] }, - { "category": "symbols", "char": "💘", "name": "cupid", "keywords": ["love", "like", "heart", "affection", "valentines"] }, - { "category": "symbols", "char": "💝", "name": "gift_heart", "keywords": ["love", "valentines"] }, - { "category": "symbols", "char": "💟", "name": "heart_decoration", "keywords": ["purple-square", "love", "like"] }, - { "category": "symbols", "char": "\u2764\uFE0F\u200D\uD83D\uDD25", "name": "heart_on_fire", "keywords": [] }, - { "category": "symbols", "char": "\u2764\uFE0F\u200D\uD83E\uDE79", "name": "mending_heart", "keywords": [] }, - { "category": "symbols", "char": "☮", "name": "peace_symbol", "keywords": ["hippie"] }, - { "category": "symbols", "char": "✝", "name": "latin_cross", "keywords": ["christianity"] }, - { "category": "symbols", "char": "☪", "name": "star_and_crescent", "keywords": ["islam"] }, - { "category": "symbols", "char": "🕉", "name": "om", "keywords": ["hinduism", "buddhism", "sikhism", "jainism"] }, - { "category": "symbols", "char": "☸", "name": "wheel_of_dharma", "keywords": ["hinduism", "buddhism", "sikhism", "jainism"] }, - { "category": "symbols", "char": "✡", "name": "star_of_david", "keywords": ["judaism"] }, - { "category": "symbols", "char": "🔯", "name": "six_pointed_star", "keywords": ["purple-square", "religion", "jewish", "hexagram"] }, - { "category": "symbols", "char": "🕎", "name": "menorah", "keywords": ["purple-square", "hanukkah", "candles", "jewish"] }, - { "category": "symbols", "char": "☯", "name": "yin_yang", "keywords": ["balance"] }, - { "category": "symbols", "char": "☦", "name": "orthodox_cross", "keywords": ["suppedaneum", "religion"] }, - { "category": "symbols", "char": "🛐", "name": "place_of_worship", "keywords": ["religion", "church", "temple", "prayer"] }, - { "category": "symbols", "char": "⛎", "name": "ophiuchus", "keywords": ["sign", "purple-square", "constellation", "astrology"] }, - { "category": "symbols", "char": "♈", "name": "aries", "keywords": ["sign", "purple-square", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♉", "name": "taurus", "keywords": ["purple-square", "sign", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♊", "name": "gemini", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♋", "name": "cancer", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♌", "name": "leo", "keywords": ["sign", "purple-square", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♍", "name": "virgo", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♎", "name": "libra", "keywords": ["sign", "purple-square", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♏", "name": "scorpius", "keywords": ["sign", "zodiac", "purple-square", "astrology", "scorpio"] }, - { "category": "symbols", "char": "♐", "name": "sagittarius", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♑", "name": "capricorn", "keywords": ["sign", "zodiac", "purple-square", "astrology"] }, - { "category": "symbols", "char": "♒", "name": "aquarius", "keywords": ["sign", "purple-square", "zodiac", "astrology"] }, - { "category": "symbols", "char": "♓", "name": "pisces", "keywords": ["purple-square", "sign", "zodiac", "astrology"] }, - { "category": "symbols", "char": "🆔", "name": "id", "keywords": ["purple-square", "words"] }, - { "category": "symbols", "char": "⚛", "name": "atom_symbol", "keywords": ["science", "physics", "chemistry"] }, - { "category": "symbols", "char": "⚧️", "name": "transgender_symbol", "keywords": ["purple-square", "woman", "female", "toilet", "loo", "restroom", "gender"] }, - { "category": "symbols", "char": "🈳", "name": "u7a7a", "keywords": ["kanji", "japanese", "chinese", "empty", "sky", "blue-square", "aki"] }, - { "category": "symbols", "char": "🈹", "name": "u5272", "keywords": ["cut", "divide", "chinese", "kanji", "pink-square", "waribiki"] }, - { "category": "symbols", "char": "☢", "name": "radioactive", "keywords": ["nuclear", "danger"] }, - { "category": "symbols", "char": "☣", "name": "biohazard", "keywords": ["danger"] }, - { "category": "symbols", "char": "📴", "name": "mobile_phone_off", "keywords": ["mute", "orange-square", "silence", "quiet"] }, - { "category": "symbols", "char": "📳", "name": "vibration_mode", "keywords": ["orange-square", "phone"] }, - { "category": "symbols", "char": "🈶", "name": "u6709", "keywords": ["orange-square", "chinese", "have", "kanji", "ari"] }, - { "category": "symbols", "char": "🈚", "name": "u7121", "keywords": ["nothing", "chinese", "kanji", "japanese", "orange-square", "nashi"] }, - { "category": "symbols", "char": "🈸", "name": "u7533", "keywords": ["chinese", "japanese", "kanji", "orange-square", "moushikomi"] }, - { "category": "symbols", "char": "🈺", "name": "u55b6", "keywords": ["japanese", "opening hours", "orange-square", "eigyo"] }, - { "category": "symbols", "char": "🈷️", "name": "u6708", "keywords": ["chinese", "month", "moon", "japanese", "orange-square", "kanji", "tsuki", "tsukigime", "getsugaku"] }, - { "category": "symbols", "char": "✴️", "name": "eight_pointed_black_star", "keywords": ["orange-square", "shape", "polygon"] }, - { "category": "symbols", "char": "🆚", "name": "vs", "keywords": ["words", "orange-square"] }, - { "category": "symbols", "char": "🉑", "name": "accept", "keywords": ["ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle"] }, - { "category": "symbols", "char": "💮", "name": "white_flower", "keywords": ["japanese", "spring"] }, - { "category": "symbols", "char": "🉐", "name": "ideograph_advantage", "keywords": ["chinese", "kanji", "obtain", "get", "circle"] }, - { "category": "symbols", "char": "㊙️", "name": "secret", "keywords": ["privacy", "chinese", "sshh", "kanji", "red-circle"] }, - { "category": "symbols", "char": "㊗️", "name": "congratulations", "keywords": ["chinese", "kanji", "japanese", "red-circle"] }, - { "category": "symbols", "char": "🈴", "name": "u5408", "keywords": ["japanese", "chinese", "join", "kanji", "red-square", "goukaku", "pass"] }, - { "category": "symbols", "char": "🈵", "name": "u6e80", "keywords": ["full", "chinese", "japanese", "red-square", "kanji", "man"] }, - { "category": "symbols", "char": "🈲", "name": "u7981", "keywords": ["kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square", "kinshi"] }, - { "category": "symbols", "char": "🅰️", "name": "a", "keywords": ["red-square", "alphabet", "letter"] }, - { "category": "symbols", "char": "🅱️", "name": "b", "keywords": ["red-square", "alphabet", "letter"] }, - { "category": "symbols", "char": "🆎", "name": "ab", "keywords": ["red-square", "alphabet"] }, - { "category": "symbols", "char": "🆑", "name": "cl", "keywords": ["alphabet", "words", "red-square"] }, - { "category": "symbols", "char": "🅾️", "name": "o2", "keywords": ["alphabet", "red-square", "letter"] }, - { "category": "symbols", "char": "🆘", "name": "sos", "keywords": ["help", "red-square", "words", "emergency", "911"] }, - { "category": "symbols", "char": "⛔", "name": "no_entry", "keywords": ["limit", "security", "privacy", "bad", "denied", "stop", "circle"] }, - { "category": "symbols", "char": "📛", "name": "name_badge", "keywords": ["fire", "forbid"] }, - { "category": "symbols", "char": "🚫", "name": "no_entry_sign", "keywords": ["forbid", "stop", "limit", "denied", "disallow", "circle"] }, - { "category": "symbols", "char": "❌", "name": "x", "keywords": ["no", "delete", "remove", "cancel", "red"] }, - { "category": "symbols", "char": "⭕", "name": "o", "keywords": ["circle", "round"] }, - { "category": "symbols", "char": "🛑", "name": "stop_sign", "keywords": ["stop"] }, - { "category": "symbols", "char": "💢", "name": "anger", "keywords": ["angry", "mad"] }, - { "category": "symbols", "char": "♨️", "name": "hotsprings", "keywords": ["bath", "warm", "relax"] }, - { "category": "symbols", "char": "🚷", "name": "no_pedestrians", "keywords": ["rules", "crossing", "walking", "circle"] }, - { "category": "symbols", "char": "🚯", "name": "do_not_litter", "keywords": ["trash", "bin", "garbage", "circle"] }, - { "category": "symbols", "char": "🚳", "name": "no_bicycles", "keywords": ["cyclist", "prohibited", "circle"] }, - { "category": "symbols", "char": "🚱", "name": "non-potable_water", "keywords": ["drink", "faucet", "tap", "circle"] }, - { "category": "symbols", "char": "🔞", "name": "underage", "keywords": ["18", "drink", "pub", "night", "minor", "circle"] }, - { "category": "symbols", "char": "📵", "name": "no_mobile_phones", "keywords": ["iphone", "mute", "circle"] }, - { "category": "symbols", "char": "❗", "name": "exclamation", "keywords": ["heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning"] }, - { "category": "symbols", "char": "❕", "name": "grey_exclamation", "keywords": ["surprise", "punctuation", "gray", "wow", "warning"] }, - { "category": "symbols", "char": "❓", "name": "question", "keywords": ["doubt", "confused"] }, - { "category": "symbols", "char": "❔", "name": "grey_question", "keywords": ["doubts", "gray", "huh", "confused"] }, - { "category": "symbols", "char": "‼️", "name": "bangbang", "keywords": ["exclamation", "surprise"] }, - { "category": "symbols", "char": "⁉️", "name": "interrobang", "keywords": ["wat", "punctuation", "surprise"] }, - { "category": "symbols", "char": "🔅", "name": "low_brightness", "keywords": ["sun", "afternoon", "warm", "summer"] }, - { "category": "symbols", "char": "🔆", "name": "high_brightness", "keywords": ["sun", "light"] }, - { "category": "symbols", "char": "🔱", "name": "trident", "keywords": ["weapon", "spear"] }, - { "category": "symbols", "char": "⚜", "name": "fleur_de_lis", "keywords": ["decorative", "scout"] }, - { "category": "symbols", "char": "〽️", "name": "part_alternation_mark", "keywords": ["graph", "presentation", "stats", "business", "economics", "bad"] }, - { "category": "symbols", "char": "⚠️", "name": "warning", "keywords": ["exclamation", "wip", "alert", "error", "problem", "issue"] }, - { "category": "symbols", "char": "🚸", "name": "children_crossing", "keywords": ["school", "warning", "danger", "sign", "driving", "yellow-diamond"] }, - { "category": "symbols", "char": "🔰", "name": "beginner", "keywords": ["badge", "shield"] }, - { "category": "symbols", "char": "♻️", "name": "recycle", "keywords": ["arrow", "environment", "garbage", "trash"] }, - { "category": "symbols", "char": "🈯", "name": "u6307", "keywords": ["chinese", "point", "green-square", "kanji", "reserved", "shiteiseki"] }, - { "category": "symbols", "char": "💹", "name": "chart", "keywords": ["green-square", "graph", "presentation", "stats"] }, - { "category": "symbols", "char": "❇️", "name": "sparkle", "keywords": ["stars", "green-square", "awesome", "good", "fireworks"] }, - { "category": "symbols", "char": "✳️", "name": "eight_spoked_asterisk", "keywords": ["star", "sparkle", "green-square"] }, - { "category": "symbols", "char": "❎", "name": "negative_squared_cross_mark", "keywords": ["x", "green-square", "no", "deny"] }, - { "category": "symbols", "char": "✅", "name": "white_check_mark", "keywords": ["green-square", "ok", "agree", "vote", "election", "answer", "tick"] }, - { "category": "symbols", "char": "💠", "name": "diamond_shape_with_a_dot_inside", "keywords": ["jewel", "blue", "gem", "crystal", "fancy"] }, - { "category": "symbols", "char": "🌀", "name": "cyclone", "keywords": ["weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon"] }, - { "category": "symbols", "char": "➿", "name": "loop", "keywords": ["tape", "cassette"] }, - { "category": "symbols", "char": "🌐", "name": "globe_with_meridians", "keywords": ["earth", "international", "world", "internet", "interweb", "i18n"] }, - { "category": "symbols", "char": "Ⓜ️", "name": "m", "keywords": ["alphabet", "blue-circle", "letter"] }, - { "category": "symbols", "char": "🏧", "name": "atm", "keywords": ["money", "sales", "cash", "blue-square", "payment", "bank"] }, - { "category": "symbols", "char": "🈂️", "name": "sa", "keywords": ["japanese", "blue-square", "katakana"] }, - { "category": "symbols", "char": "🛂", "name": "passport_control", "keywords": ["custom", "blue-square"] }, - { "category": "symbols", "char": "🛃", "name": "customs", "keywords": ["passport", "border", "blue-square"] }, - { "category": "symbols", "char": "🛄", "name": "baggage_claim", "keywords": ["blue-square", "airport", "transport"] }, - { "category": "symbols", "char": "🛅", "name": "left_luggage", "keywords": ["blue-square", "travel"] }, - { "category": "symbols", "char": "♿", "name": "wheelchair", "keywords": ["blue-square", "disabled", "a11y", "accessibility"] }, - { "category": "symbols", "char": "🚭", "name": "no_smoking", "keywords": ["cigarette", "blue-square", "smell", "smoke"] }, - { "category": "symbols", "char": "🚾", "name": "wc", "keywords": ["toilet", "restroom", "blue-square"] }, - { "category": "symbols", "char": "🅿️", "name": "parking", "keywords": ["cars", "blue-square", "alphabet", "letter"] }, - { "category": "symbols", "char": "🚰", "name": "potable_water", "keywords": ["blue-square", "liquid", "restroom", "cleaning", "faucet"] }, - { "category": "symbols", "char": "🚹", "name": "mens", "keywords": ["toilet", "restroom", "wc", "blue-square", "gender", "male"] }, - { "category": "symbols", "char": "🚺", "name": "womens", "keywords": ["purple-square", "woman", "female", "toilet", "loo", "restroom", "gender"] }, - { "category": "symbols", "char": "🚼", "name": "baby_symbol", "keywords": ["orange-square", "child"] }, - { "category": "symbols", "char": "🚻", "name": "restroom", "keywords": ["blue-square", "toilet", "refresh", "wc", "gender"] }, - { "category": "symbols", "char": "🚮", "name": "put_litter_in_its_place", "keywords": ["blue-square", "sign", "human", "info"] }, - { "category": "symbols", "char": "🎦", "name": "cinema", "keywords": ["blue-square", "record", "film", "movie", "curtain", "stage", "theater"] }, - { "category": "symbols", "char": "📶", "name": "signal_strength", "keywords": ["blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars"] }, - { "category": "symbols", "char": "🈁", "name": "koko", "keywords": ["blue-square", "here", "katakana", "japanese", "destination"] }, - { "category": "symbols", "char": "🆖", "name": "ng", "keywords": ["blue-square", "words", "shape", "icon"] }, - { "category": "symbols", "char": "🆗", "name": "ok", "keywords": ["good", "agree", "yes", "blue-square"] }, - { "category": "symbols", "char": "🆙", "name": "up", "keywords": ["blue-square", "above", "high"] }, - { "category": "symbols", "char": "🆒", "name": "cool", "keywords": ["words", "blue-square"] }, - { "category": "symbols", "char": "🆕", "name": "new", "keywords": ["blue-square", "words", "start"] }, - { "category": "symbols", "char": "🆓", "name": "free", "keywords": ["blue-square", "words"] }, - { "category": "symbols", "char": "0️⃣", "name": "zero", "keywords": ["0", "numbers", "blue-square", "null"] }, - { "category": "symbols", "char": "1️⃣", "name": "one", "keywords": ["blue-square", "numbers", "1"] }, - { "category": "symbols", "char": "2️⃣", "name": "two", "keywords": ["numbers", "2", "prime", "blue-square"] }, - { "category": "symbols", "char": "3️⃣", "name": "three", "keywords": ["3", "numbers", "prime", "blue-square"] }, - { "category": "symbols", "char": "4️⃣", "name": "four", "keywords": ["4", "numbers", "blue-square"] }, - { "category": "symbols", "char": "5️⃣", "name": "five", "keywords": ["5", "numbers", "blue-square", "prime"] }, - { "category": "symbols", "char": "6️⃣", "name": "six", "keywords": ["6", "numbers", "blue-square"] }, - { "category": "symbols", "char": "7️⃣", "name": "seven", "keywords": ["7", "numbers", "blue-square", "prime"] }, - { "category": "symbols", "char": "8️⃣", "name": "eight", "keywords": ["8", "blue-square", "numbers"] }, - { "category": "symbols", "char": "9️⃣", "name": "nine", "keywords": ["blue-square", "numbers", "9"] }, - { "category": "symbols", "char": "🔟", "name": "keycap_ten", "keywords": ["numbers", "10", "blue-square"] }, - { "category": "symbols", "char": "*⃣", "name": "asterisk", "keywords": ["star", "keycap"] }, - { "category": "symbols", "char": "⏏️", "name": "eject_button", "keywords": ["blue-square"] }, - { "category": "symbols", "char": "▶️", "name": "arrow_forward", "keywords": ["blue-square", "right", "direction", "play"] }, - { "category": "symbols", "char": "⏸", "name": "pause_button", "keywords": ["pause", "blue-square"] }, - { "category": "symbols", "char": "⏭", "name": "next_track_button", "keywords": ["forward", "next", "blue-square"] }, - { "category": "symbols", "char": "⏹", "name": "stop_button", "keywords": ["blue-square"] }, - { "category": "symbols", "char": "⏺", "name": "record_button", "keywords": ["blue-square"] }, - { "category": "symbols", "char": "⏯", "name": "play_or_pause_button", "keywords": ["blue-square", "play", "pause"] }, - { "category": "symbols", "char": "⏮", "name": "previous_track_button", "keywords": ["backward"] }, - { "category": "symbols", "char": "⏩", "name": "fast_forward", "keywords": ["blue-square", "play", "speed", "continue"] }, - { "category": "symbols", "char": "⏪", "name": "rewind", "keywords": ["play", "blue-square"] }, - { "category": "symbols", "char": "🔀", "name": "twisted_rightwards_arrows", "keywords": ["blue-square", "shuffle", "music", "random"] }, - { "category": "symbols", "char": "🔁", "name": "repeat", "keywords": ["loop", "record"] }, - { "category": "symbols", "char": "🔂", "name": "repeat_one", "keywords": ["blue-square", "loop"] }, - { "category": "symbols", "char": "◀️", "name": "arrow_backward", "keywords": ["blue-square", "left", "direction"] }, - { "category": "symbols", "char": "🔼", "name": "arrow_up_small", "keywords": ["blue-square", "triangle", "direction", "point", "forward", "top"] }, - { "category": "symbols", "char": "🔽", "name": "arrow_down_small", "keywords": ["blue-square", "direction", "bottom"] }, - { "category": "symbols", "char": "⏫", "name": "arrow_double_up", "keywords": ["blue-square", "direction", "top"] }, - { "category": "symbols", "char": "⏬", "name": "arrow_double_down", "keywords": ["blue-square", "direction", "bottom"] }, - { "category": "symbols", "char": "➡️", "name": "arrow_right", "keywords": ["blue-square", "next"] }, - { "category": "symbols", "char": "⬅️", "name": "arrow_left", "keywords": ["blue-square", "previous", "back"] }, - { "category": "symbols", "char": "⬆️", "name": "arrow_up", "keywords": ["blue-square", "continue", "top", "direction"] }, - { "category": "symbols", "char": "⬇️", "name": "arrow_down", "keywords": ["blue-square", "direction", "bottom"] }, - { "category": "symbols", "char": "↗️", "name": "arrow_upper_right", "keywords": ["blue-square", "point", "direction", "diagonal", "northeast"] }, - { "category": "symbols", "char": "↘️", "name": "arrow_lower_right", "keywords": ["blue-square", "direction", "diagonal", "southeast"] }, - { "category": "symbols", "char": "↙️", "name": "arrow_lower_left", "keywords": ["blue-square", "direction", "diagonal", "southwest"] }, - { "category": "symbols", "char": "↖️", "name": "arrow_upper_left", "keywords": ["blue-square", "point", "direction", "diagonal", "northwest"] }, - { "category": "symbols", "char": "↕️", "name": "arrow_up_down", "keywords": ["blue-square", "direction", "way", "vertical"] }, - { "category": "symbols", "char": "↔️", "name": "left_right_arrow", "keywords": ["shape", "direction", "horizontal", "sideways"] }, - { "category": "symbols", "char": "🔄", "name": "arrows_counterclockwise", "keywords": ["blue-square", "sync", "cycle"] }, - { "category": "symbols", "char": "↪️", "name": "arrow_right_hook", "keywords": ["blue-square", "return", "rotate", "direction"] }, - { "category": "symbols", "char": "↩️", "name": "leftwards_arrow_with_hook", "keywords": ["back", "return", "blue-square", "undo", "enter"] }, - { "category": "symbols", "char": "⤴️", "name": "arrow_heading_up", "keywords": ["blue-square", "direction", "top"] }, - { "category": "symbols", "char": "⤵️", "name": "arrow_heading_down", "keywords": ["blue-square", "direction", "bottom"] }, - { "category": "symbols", "char": "#️⃣", "name": "hash", "keywords": ["symbol", "blue-square", "twitter"] }, - { "category": "symbols", "char": "ℹ️", "name": "information_source", "keywords": ["blue-square", "alphabet", "letter"] }, - { "category": "symbols", "char": "🔤", "name": "abc", "keywords": ["blue-square", "alphabet"] }, - { "category": "symbols", "char": "🔡", "name": "abcd", "keywords": ["blue-square", "alphabet"] }, - { "category": "symbols", "char": "🔠", "name": "capital_abcd", "keywords": ["alphabet", "words", "blue-square"] }, - { "category": "symbols", "char": "🔣", "name": "symbols", "keywords": ["blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters"] }, - { "category": "symbols", "char": "🎵", "name": "musical_note", "keywords": ["score", "tone", "sound"] }, - { "category": "symbols", "char": "🎶", "name": "notes", "keywords": ["music", "score"] }, - { "category": "symbols", "char": "〰️", "name": "wavy_dash", "keywords": ["draw", "line", "moustache", "mustache", "squiggle", "scribble"] }, - { "category": "symbols", "char": "➰", "name": "curly_loop", "keywords": ["scribble", "draw", "shape", "squiggle"] }, - { "category": "symbols", "char": "✔️", "name": "heavy_check_mark", "keywords": ["ok", "nike", "answer", "yes", "tick"] }, - { "category": "symbols", "char": "🔃", "name": "arrows_clockwise", "keywords": ["sync", "cycle", "round", "repeat"] }, - { "category": "symbols", "char": "➕", "name": "heavy_plus_sign", "keywords": ["math", "calculation", "addition", "more", "increase"] }, - { "category": "symbols", "char": "➖", "name": "heavy_minus_sign", "keywords": ["math", "calculation", "subtract", "less"] }, - { "category": "symbols", "char": "➗", "name": "heavy_division_sign", "keywords": ["divide", "math", "calculation"] }, - { "category": "symbols", "char": "✖️", "name": "heavy_multiplication_x", "keywords": ["math", "calculation"] }, - { "category": "symbols", "char": "\uD83D\uDFF0", "name": "heavy_equals_sign", "keywords": [] }, - { "category": "symbols", "char": "♾", "name": "infinity", "keywords": ["forever"] }, - { "category": "symbols", "char": "💲", "name": "heavy_dollar_sign", "keywords": ["money", "sales", "payment", "currency", "buck"] }, - { "category": "symbols", "char": "💱", "name": "currency_exchange", "keywords": ["money", "sales", "dollar", "travel"] }, - { "category": "symbols", "char": "©️", "name": "copyright", "keywords": ["ip", "license", "circle", "law", "legal"] }, - { "category": "symbols", "char": "®️", "name": "registered", "keywords": ["alphabet", "circle"] }, - { "category": "symbols", "char": "™️", "name": "tm", "keywords": ["trademark", "brand", "law", "legal"] }, - { "category": "symbols", "char": "🔚", "name": "end", "keywords": ["words", "arrow"] }, - { "category": "symbols", "char": "🔙", "name": "back", "keywords": ["arrow", "words", "return"] }, - { "category": "symbols", "char": "🔛", "name": "on", "keywords": ["arrow", "words"] }, - { "category": "symbols", "char": "🔝", "name": "top", "keywords": ["words", "blue-square"] }, - { "category": "symbols", "char": "🔜", "name": "soon", "keywords": ["arrow", "words"] }, - { "category": "symbols", "char": "☑️", "name": "ballot_box_with_check", "keywords": ["ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick"] }, - { "category": "symbols", "char": "🔘", "name": "radio_button", "keywords": ["input", "old", "music", "circle"] }, - { "category": "symbols", "char": "⚫", "name": "black_circle", "keywords": ["shape", "button", "round"] }, - { "category": "symbols", "char": "⚪", "name": "white_circle", "keywords": ["shape", "round"] }, - { "category": "symbols", "char": "🔴", "name": "red_circle", "keywords": ["shape", "error", "danger"] }, - { "category": "symbols", "char": "🟠", "name": "orange_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟡", "name": "yellow_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟢", "name": "green_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🔵", "name": "large_blue_circle", "keywords": ["shape", "icon", "button"] }, - { "category": "symbols", "char": "🟣", "name": "purple_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟤", "name": "brown_circle", "keywords": ["shape"] }, - { "category": "symbols", "char": "🔸", "name": "small_orange_diamond", "keywords": ["shape", "jewel", "gem"] }, - { "category": "symbols", "char": "🔹", "name": "small_blue_diamond", "keywords": ["shape", "jewel", "gem"] }, - { "category": "symbols", "char": "🔶", "name": "large_orange_diamond", "keywords": ["shape", "jewel", "gem"] }, - { "category": "symbols", "char": "🔷", "name": "large_blue_diamond", "keywords": ["shape", "jewel", "gem"] }, - { "category": "symbols", "char": "🔺", "name": "small_red_triangle", "keywords": ["shape", "direction", "up", "top"] }, - { "category": "symbols", "char": "▪️", "name": "black_small_square", "keywords": ["shape", "icon"] }, - { "category": "symbols", "char": "▫️", "name": "white_small_square", "keywords": ["shape", "icon"] }, - { "category": "symbols", "char": "⬛", "name": "black_large_square", "keywords": ["shape", "icon", "button"] }, - { "category": "symbols", "char": "⬜", "name": "white_large_square", "keywords": ["shape", "icon", "stone", "button"] }, - { "category": "symbols", "char": "🟥", "name": "red_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟧", "name": "orange_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟨", "name": "yellow_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟩", "name": "green_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟦", "name": "blue_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟪", "name": "purple_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🟫", "name": "brown_square", "keywords": ["shape"] }, - { "category": "symbols", "char": "🔻", "name": "small_red_triangle_down", "keywords": ["shape", "direction", "bottom"] }, - { "category": "symbols", "char": "◼️", "name": "black_medium_square", "keywords": ["shape", "button", "icon"] }, - { "category": "symbols", "char": "◻️", "name": "white_medium_square", "keywords": ["shape", "stone", "icon"] }, - { "category": "symbols", "char": "◾", "name": "black_medium_small_square", "keywords": ["icon", "shape", "button"] }, - { "category": "symbols", "char": "◽", "name": "white_medium_small_square", "keywords": ["shape", "stone", "icon", "button"] }, - { "category": "symbols", "char": "🔲", "name": "black_square_button", "keywords": ["shape", "input", "frame"] }, - { "category": "symbols", "char": "🔳", "name": "white_square_button", "keywords": ["shape", "input"] }, - { "category": "symbols", "char": "🔈", "name": "speaker", "keywords": ["sound", "volume", "silence", "broadcast"] }, - { "category": "symbols", "char": "🔉", "name": "sound", "keywords": ["volume", "speaker", "broadcast"] }, - { "category": "symbols", "char": "🔊", "name": "loud_sound", "keywords": ["volume", "noise", "noisy", "speaker", "broadcast"] }, - { "category": "symbols", "char": "🔇", "name": "mute", "keywords": ["sound", "volume", "silence", "quiet"] }, - { "category": "symbols", "char": "📣", "name": "mega", "keywords": ["sound", "speaker", "volume"] }, - { "category": "symbols", "char": "📢", "name": "loudspeaker", "keywords": ["volume", "sound"] }, - { "category": "symbols", "char": "🔔", "name": "bell", "keywords": ["sound", "notification", "christmas", "xmas", "chime"] }, - { "category": "symbols", "char": "🔕", "name": "no_bell", "keywords": ["sound", "volume", "mute", "quiet", "silent"] }, - { "category": "symbols", "char": "🃏", "name": "black_joker", "keywords": ["poker", "cards", "game", "play", "magic"] }, - { "category": "symbols", "char": "🀄", "name": "mahjong", "keywords": ["game", "play", "chinese", "kanji"] }, - { "category": "symbols", "char": "♠️", "name": "spades", "keywords": ["poker", "cards", "suits", "magic"] }, - { "category": "symbols", "char": "♣️", "name": "clubs", "keywords": ["poker", "cards", "magic", "suits"] }, - { "category": "symbols", "char": "❤️", "name": "hearts", "keywords": ["poker", "cards", "magic", "suits"] }, - { "category": "symbols", "char": "♦️", "name": "diamonds", "keywords": ["poker", "cards", "magic", "suits"] }, - { "category": "symbols", "char": "🎴", "name": "flower_playing_cards", "keywords": ["game", "sunset", "red"] }, - { "category": "symbols", "char": "💭", "name": "thought_balloon", "keywords": ["bubble", "cloud", "speech", "thinking", "dream"] }, - { "category": "symbols", "char": "🗯", "name": "right_anger_bubble", "keywords": ["caption", "speech", "thinking", "mad"] }, - { "category": "symbols", "char": "💬", "name": "speech_balloon", "keywords": ["bubble", "words", "message", "talk", "chatting"] }, - { "category": "symbols", "char": "🗨", "name": "left_speech_bubble", "keywords": ["words", "message", "talk", "chatting"] }, - { "category": "symbols", "char": "🕐", "name": "clock1", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕑", "name": "clock2", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕒", "name": "clock3", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕓", "name": "clock4", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕔", "name": "clock5", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕕", "name": "clock6", "keywords": ["time", "late", "early", "schedule", "dawn", "dusk"] }, - { "category": "symbols", "char": "🕖", "name": "clock7", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕗", "name": "clock8", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕘", "name": "clock9", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕙", "name": "clock10", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕚", "name": "clock11", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕛", "name": "clock12", "keywords": ["time", "noon", "midnight", "midday", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕜", "name": "clock130", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕝", "name": "clock230", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕞", "name": "clock330", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕟", "name": "clock430", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕠", "name": "clock530", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕡", "name": "clock630", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕢", "name": "clock730", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕣", "name": "clock830", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕤", "name": "clock930", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕥", "name": "clock1030", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕦", "name": "clock1130", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "symbols", "char": "🕧", "name": "clock1230", "keywords": ["time", "late", "early", "schedule"] }, - { "category": "flags", "char": "🇦🇫", "name": "afghanistan", "keywords": ["af", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇽", "name": "aland_islands", "keywords": ["Åland", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇱", "name": "albania", "keywords": ["al", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇿", "name": "algeria", "keywords": ["dz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇸", "name": "american_samoa", "keywords": ["american", "ws", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇩", "name": "andorra", "keywords": ["ad", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇴", "name": "angola", "keywords": ["ao", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇮", "name": "anguilla", "keywords": ["ai", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇶", "name": "antarctica", "keywords": ["aq", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇬", "name": "antigua_barbuda", "keywords": ["antigua", "barbuda", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇷", "name": "argentina", "keywords": ["ar", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇲", "name": "armenia", "keywords": ["am", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇼", "name": "aruba", "keywords": ["aw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇨", "name": "ascension_island", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇺", "name": "australia", "keywords": ["au", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇹", "name": "austria", "keywords": ["at", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇿", "name": "azerbaijan", "keywords": ["az", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇸", "name": "bahamas", "keywords": ["bs", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇭", "name": "bahrain", "keywords": ["bh", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇩", "name": "bangladesh", "keywords": ["bd", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇧", "name": "barbados", "keywords": ["bb", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇾", "name": "belarus", "keywords": ["by", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇪", "name": "belgium", "keywords": ["be", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇿", "name": "belize", "keywords": ["bz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇯", "name": "benin", "keywords": ["bj", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇲", "name": "bermuda", "keywords": ["bm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇹", "name": "bhutan", "keywords": ["bt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇴", "name": "bolivia", "keywords": ["bo", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇶", "name": "caribbean_netherlands", "keywords": ["bonaire", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇦", "name": "bosnia_herzegovina", "keywords": ["bosnia", "herzegovina", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇼", "name": "botswana", "keywords": ["bw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇷", "name": "brazil", "keywords": ["br", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇴", "name": "british_indian_ocean_territory", "keywords": ["british", "indian", "ocean", "territory", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇬", "name": "british_virgin_islands", "keywords": ["british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇳", "name": "brunei", "keywords": ["bn", "darussalam", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇬", "name": "bulgaria", "keywords": ["bg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇫", "name": "burkina_faso", "keywords": ["burkina", "faso", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇮", "name": "burundi", "keywords": ["bi", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇻", "name": "cape_verde", "keywords": ["cabo", "verde", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇭", "name": "cambodia", "keywords": ["kh", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇲", "name": "cameroon", "keywords": ["cm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇦", "name": "canada", "keywords": ["ca", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇨", "name": "canary_islands", "keywords": ["canary", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇾", "name": "cayman_islands", "keywords": ["cayman", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇫", "name": "central_african_republic", "keywords": ["central", "african", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇩", "name": "chad", "keywords": ["td", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇱", "name": "chile", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇳", "name": "cn", "keywords": ["china", "chinese", "prc", "flag", "country", "nation", "banner"] }, - { "category": "flags", "char": "🇨🇽", "name": "christmas_island", "keywords": ["christmas", "island", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇨", "name": "cocos_islands", "keywords": ["cocos", "keeling", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇴", "name": "colombia", "keywords": ["co", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇲", "name": "comoros", "keywords": ["km", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇬", "name": "congo_brazzaville", "keywords": ["congo", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇩", "name": "congo_kinshasa", "keywords": ["congo", "democratic", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇰", "name": "cook_islands", "keywords": ["cook", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇷", "name": "costa_rica", "keywords": ["costa", "rica", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇷", "name": "croatia", "keywords": ["hr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇺", "name": "cuba", "keywords": ["cu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇼", "name": "curacao", "keywords": ["curaçao", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇾", "name": "cyprus", "keywords": ["cy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇿", "name": "czech_republic", "keywords": ["cz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇰", "name": "denmark", "keywords": ["dk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇯", "name": "djibouti", "keywords": ["dj", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇲", "name": "dominica", "keywords": ["dm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇴", "name": "dominican_republic", "keywords": ["dominican", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇨", "name": "ecuador", "keywords": ["ec", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇬", "name": "egypt", "keywords": ["eg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇻", "name": "el_salvador", "keywords": ["el", "salvador", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇶", "name": "equatorial_guinea", "keywords": ["equatorial", "gn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇷", "name": "eritrea", "keywords": ["er", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇪", "name": "estonia", "keywords": ["ee", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇹", "name": "ethiopia", "keywords": ["et", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇺", "name": "eu", "keywords": ["european", "union", "flag", "banner"] }, - { "category": "flags", "char": "🇫🇰", "name": "falkland_islands", "keywords": ["falkland", "islands", "malvinas", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇴", "name": "faroe_islands", "keywords": ["faroe", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇯", "name": "fiji", "keywords": ["fj", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇮", "name": "finland", "keywords": ["fi", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇷", "name": "fr", "keywords": ["banner", "flag", "nation", "france", "french", "country"] }, - { "category": "flags", "char": "🇬🇫", "name": "french_guiana", "keywords": ["french", "guiana", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇫", "name": "french_polynesia", "keywords": ["french", "polynesia", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇫", "name": "french_southern_territories", "keywords": ["french", "southern", "territories", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇦", "name": "gabon", "keywords": ["ga", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇲", "name": "gambia", "keywords": ["gm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇪", "name": "georgia", "keywords": ["ge", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇩🇪", "name": "de", "keywords": ["german", "nation", "flag", "country", "banner"] }, - { "category": "flags", "char": "🇬🇭", "name": "ghana", "keywords": ["gh", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇮", "name": "gibraltar", "keywords": ["gi", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇷", "name": "greece", "keywords": ["gr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇱", "name": "greenland", "keywords": ["gl", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇩", "name": "grenada", "keywords": ["gd", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇵", "name": "guadeloupe", "keywords": ["gp", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇺", "name": "guam", "keywords": ["gu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇹", "name": "guatemala", "keywords": ["gt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇬", "name": "guernsey", "keywords": ["gg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇳", "name": "guinea", "keywords": ["gn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇼", "name": "guinea_bissau", "keywords": ["gw", "bissau", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇾", "name": "guyana", "keywords": ["gy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇹", "name": "haiti", "keywords": ["ht", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇳", "name": "honduras", "keywords": ["hn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇰", "name": "hong_kong", "keywords": ["hong", "kong", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇭🇺", "name": "hungary", "keywords": ["hu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇸", "name": "iceland", "keywords": ["is", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇳", "name": "india", "keywords": ["in", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇩", "name": "indonesia", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇷", "name": "iran", "keywords": ["iran, ", "islamic", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇶", "name": "iraq", "keywords": ["iq", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇪", "name": "ireland", "keywords": ["ie", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇲", "name": "isle_of_man", "keywords": ["isle", "man", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇱", "name": "israel", "keywords": ["il", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇮🇹", "name": "it", "keywords": ["italy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇮", "name": "cote_divoire", "keywords": ["ivory", "coast", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇯🇲", "name": "jamaica", "keywords": ["jm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇯🇵", "name": "jp", "keywords": ["japanese", "nation", "flag", "country", "banner"] }, - { "category": "flags", "char": "🇯🇪", "name": "jersey", "keywords": ["je", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇯🇴", "name": "jordan", "keywords": ["jo", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇿", "name": "kazakhstan", "keywords": ["kz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇪", "name": "kenya", "keywords": ["ke", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇮", "name": "kiribati", "keywords": ["ki", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇽🇰", "name": "kosovo", "keywords": ["xk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇼", "name": "kuwait", "keywords": ["kw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇬", "name": "kyrgyzstan", "keywords": ["kg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇦", "name": "laos", "keywords": ["lao", "democratic", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇻", "name": "latvia", "keywords": ["lv", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇧", "name": "lebanon", "keywords": ["lb", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇸", "name": "lesotho", "keywords": ["ls", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇷", "name": "liberia", "keywords": ["lr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇾", "name": "libya", "keywords": ["ly", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇮", "name": "liechtenstein", "keywords": ["li", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇹", "name": "lithuania", "keywords": ["lt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇺", "name": "luxembourg", "keywords": ["lu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇴", "name": "macau", "keywords": ["macao", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇰", "name": "macedonia", "keywords": ["macedonia, ", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇬", "name": "madagascar", "keywords": ["mg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇼", "name": "malawi", "keywords": ["mw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇾", "name": "malaysia", "keywords": ["my", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇻", "name": "maldives", "keywords": ["mv", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇱", "name": "mali", "keywords": ["ml", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇹", "name": "malta", "keywords": ["mt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇭", "name": "marshall_islands", "keywords": ["marshall", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇶", "name": "martinique", "keywords": ["mq", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇷", "name": "mauritania", "keywords": ["mr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇺", "name": "mauritius", "keywords": ["mu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇾🇹", "name": "mayotte", "keywords": ["yt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇽", "name": "mexico", "keywords": ["mx", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇫🇲", "name": "micronesia", "keywords": ["micronesia, ", "federated", "states", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇩", "name": "moldova", "keywords": ["moldova, ", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇨", "name": "monaco", "keywords": ["mc", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇳", "name": "mongolia", "keywords": ["mn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇪", "name": "montenegro", "keywords": ["me", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇸", "name": "montserrat", "keywords": ["ms", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇦", "name": "morocco", "keywords": ["ma", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇿", "name": "mozambique", "keywords": ["mz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇲", "name": "myanmar", "keywords": ["mm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇦", "name": "namibia", "keywords": ["na", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇷", "name": "nauru", "keywords": ["nr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇵", "name": "nepal", "keywords": ["np", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇱", "name": "netherlands", "keywords": ["nl", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇨", "name": "new_caledonia", "keywords": ["new", "caledonia", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇿", "name": "new_zealand", "keywords": ["new", "zealand", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇮", "name": "nicaragua", "keywords": ["ni", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇪", "name": "niger", "keywords": ["ne", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇬", "name": "nigeria", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇺", "name": "niue", "keywords": ["nu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇳🇫", "name": "norfolk_island", "keywords": ["norfolk", "island", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇲🇵", "name": "northern_mariana_islands", "keywords": ["northern", "mariana", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇵", "name": "north_korea", "keywords": ["north", "korea", "nation", "flag", "country", "banner"] }, - { "category": "flags", "char": "🇳🇴", "name": "norway", "keywords": ["no", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇴🇲", "name": "oman", "keywords": ["om_symbol", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇰", "name": "pakistan", "keywords": ["pk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇼", "name": "palau", "keywords": ["pw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇸", "name": "palestinian_territories", "keywords": ["palestine", "palestinian", "territories", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇦", "name": "panama", "keywords": ["pa", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇬", "name": "papua_new_guinea", "keywords": ["papua", "new", "guinea", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇾", "name": "paraguay", "keywords": ["py", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇪", "name": "peru", "keywords": ["pe", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇭", "name": "philippines", "keywords": ["ph", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇳", "name": "pitcairn_islands", "keywords": ["pitcairn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇱", "name": "poland", "keywords": ["pl", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇹", "name": "portugal", "keywords": ["pt", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇷", "name": "puerto_rico", "keywords": ["puerto", "rico", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇶🇦", "name": "qatar", "keywords": ["qa", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇪", "name": "reunion", "keywords": ["réunion", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇴", "name": "romania", "keywords": ["ro", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇺", "name": "ru", "keywords": ["russian", "federation", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇼", "name": "rwanda", "keywords": ["rw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇧🇱", "name": "st_barthelemy", "keywords": ["saint", "barthélemy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇭", "name": "st_helena", "keywords": ["saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇳", "name": "st_kitts_nevis", "keywords": ["saint", "kitts", "nevis", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇨", "name": "st_lucia", "keywords": ["saint", "lucia", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇵🇲", "name": "st_pierre_miquelon", "keywords": ["saint", "pierre", "miquelon", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇨", "name": "st_vincent_grenadines", "keywords": ["saint", "vincent", "grenadines", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇼🇸", "name": "samoa", "keywords": ["ws", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇲", "name": "san_marino", "keywords": ["san", "marino", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇹", "name": "sao_tome_principe", "keywords": ["sao", "tome", "principe", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇦", "name": "saudi_arabia", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇳", "name": "senegal", "keywords": ["sn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇷🇸", "name": "serbia", "keywords": ["rs", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇨", "name": "seychelles", "keywords": ["sc", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇱", "name": "sierra_leone", "keywords": ["sierra", "leone", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇬", "name": "singapore", "keywords": ["sg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇽", "name": "sint_maarten", "keywords": ["sint", "maarten", "dutch", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇰", "name": "slovakia", "keywords": ["sk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇮", "name": "slovenia", "keywords": ["si", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇧", "name": "solomon_islands", "keywords": ["solomon", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇴", "name": "somalia", "keywords": ["so", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇿🇦", "name": "south_africa", "keywords": ["south", "africa", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇸", "name": "south_georgia_south_sandwich_islands", "keywords": ["south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇰🇷", "name": "kr", "keywords": ["south", "korea", "nation", "flag", "country", "banner"] }, - { "category": "flags", "char": "🇸🇸", "name": "south_sudan", "keywords": ["south", "sd", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇸", "name": "es", "keywords": ["spain", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇱🇰", "name": "sri_lanka", "keywords": ["sri", "lanka", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇩", "name": "sudan", "keywords": ["sd", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇷", "name": "suriname", "keywords": ["sr", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇿", "name": "swaziland", "keywords": ["sz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇪", "name": "sweden", "keywords": ["se", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇨🇭", "name": "switzerland", "keywords": ["ch", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇸🇾", "name": "syria", "keywords": ["syrian", "arab", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇼", "name": "taiwan", "keywords": ["tw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇯", "name": "tajikistan", "keywords": ["tj", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇿", "name": "tanzania", "keywords": ["tanzania, ", "united", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇭", "name": "thailand", "keywords": ["th", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇱", "name": "timor_leste", "keywords": ["timor", "leste", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇬", "name": "togo", "keywords": ["tg", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇰", "name": "tokelau", "keywords": ["tk", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇴", "name": "tonga", "keywords": ["to", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇹", "name": "trinidad_tobago", "keywords": ["trinidad", "tobago", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇦", "name": "tristan_da_cunha", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇳", "name": "tunisia", "keywords": ["tn", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇷", "name": "tr", "keywords": ["turkey", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇲", "name": "turkmenistan", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇨", "name": "turks_caicos_islands", "keywords": ["turks", "caicos", "islands", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇹🇻", "name": "tuvalu", "keywords": ["flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇬", "name": "uganda", "keywords": ["ug", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇦", "name": "ukraine", "keywords": ["ua", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇦🇪", "name": "united_arab_emirates", "keywords": ["united", "arab", "emirates", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇬🇧", "name": "uk", "keywords": ["united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack"] }, - { "category": "flags", "char": "🏴", "name": "england", "keywords": ["flag", "english"] }, - { "category": "flags", "char": "🏴", "name": "scotland", "keywords": ["flag", "scottish"] }, - { "category": "flags", "char": "🏴", "name": "wales", "keywords": ["flag", "welsh"] }, - { "category": "flags", "char": "🇺🇸", "name": "us", "keywords": ["united", "states", "america", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇮", "name": "us_virgin_islands", "keywords": ["virgin", "islands", "us", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇾", "name": "uruguay", "keywords": ["uy", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇿", "name": "uzbekistan", "keywords": ["uz", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇺", "name": "vanuatu", "keywords": ["vu", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇦", "name": "vatican_city", "keywords": ["vatican", "city", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇪", "name": "venezuela", "keywords": ["ve", "bolivarian", "republic", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇻🇳", "name": "vietnam", "keywords": ["viet", "nam", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇼🇫", "name": "wallis_futuna", "keywords": ["wallis", "futuna", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇪🇭", "name": "western_sahara", "keywords": ["western", "sahara", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇾🇪", "name": "yemen", "keywords": ["ye", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇿🇲", "name": "zambia", "keywords": ["zm", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇿🇼", "name": "zimbabwe", "keywords": ["zw", "flag", "nation", "country", "banner"] }, - { "category": "flags", "char": "🇺🇳", "name": "united_nations", "keywords": ["un", "flag", "banner"] }, - { "category": "flags", "char": "🏴☠️", "name": "pirate_flag", "keywords": ["skull", "crossbones", "flag", "banner"] } -] - diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts index 5d9ae12f36..1c68b87c95 100644 --- a/packages/client/src/init.ts +++ b/packages/client/src/init.ts @@ -12,8 +12,9 @@ import "@phosphor-icons/web/fill"; //#region account indexedDB migration import { set } from "@/scripts/idb-proxy"; -if (localStorage.getItem("accounts") != null) { - set("accounts", JSON.parse(localStorage.getItem("accounts"))); +const accounts = localStorage.getItem("accounts"); +if (accounts) { + set("accounts", JSON.parse(accounts)); localStorage.removeItem("accounts"); } //#endregion @@ -50,6 +51,18 @@ import { reactionPicker } from "@/scripts/reaction-picker"; import { getUrlWithoutLoginId } from "@/scripts/login-id"; import { getAccountFromId } from "@/scripts/get-account-from-id"; +function checkForSplash() { + const splash = document.getElementById("splash"); + // 念のためnullチェック(HTMLが古い場合があるため(そのうち消す)) + if (splash) { + splash.style.opacity = "0"; + splash.style.pointerEvents = "none"; + splash.addEventListener("transitionend", () => { + splash.remove(); + }); + } +} + (async () => { console.info(`Calckey v${version}`); @@ -105,7 +118,7 @@ import { getAccountFromId } from "@/scripts/get-account-from-id"; //#region Set lang attr const html = document.documentElement; - html.setAttribute("lang", lang); + html.setAttribute("lang", lang || "en-US"); //#endregion //#region loginId @@ -198,12 +211,7 @@ import { getAccountFromId } from "@/scripts/get-account-from-id"; directives(app); components(app); - const splash = document.getElementById("splash"); - // 念のためnullチェック(HTMLが古い場合があるため(そのうち消す)) - if (splash) - splash.addEventListener("transitionend", () => { - splash.remove(); - }); + checkForSplash(); // https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 // なぜかinit.tsの内容が2回実行されることがあるため、mountするdivを1つに制限する @@ -231,10 +239,7 @@ import { getAccountFromId } from "@/scripts/get-account-from-id"; reactionPicker.init(); - if (splash) { - splash.style.opacity = "0"; - splash.style.pointerEvents = "none"; - } + checkForSplash(); // クライアントが更新されたか? const lastVersion = localStorage.getItem("lastVersion"); diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts index 376d5184e5..0802d8e345 100644 --- a/packages/client/src/os.ts +++ b/packages/client/src/os.ts @@ -22,7 +22,7 @@ const apiClient = new Misskey.api.APIClient({ export const api = (( endpoint: string, data: Record<string, any> = {}, - token?: string | null | undefined + token?: string | null | undefined, ) => { pendingApiRequestsCount.value++; @@ -36,16 +36,13 @@ export const api = (( : undefined; const promise = new Promise((resolve, reject) => { - fetch( - endpoint.indexOf("://") > -1 ? endpoint : `${apiUrl}/${endpoint}`, - { - method: "POST", - body: JSON.stringify(data), - credentials: "omit", - cache: "no-cache", - headers: authorization ? { authorization } : {}, - } - ) + fetch(endpoint.indexOf("://") > -1 ? endpoint : `${apiUrl}/${endpoint}`, { + method: "POST", + body: JSON.stringify(data), + credentials: "omit", + cache: "no-cache", + headers: authorization ? { authorization } : {}, + }) .then(async (res) => { const body = res.status === 204 ? null : await res.json(); @@ -68,7 +65,7 @@ export const api = (( export const apiGet = (( endpoint: string, data: Record<string, any> = {}, - token?: string | null | undefined + token?: string | null | undefined, ) => { pendingApiRequestsCount.value++; @@ -113,7 +110,7 @@ export const apiGet = (( export const apiWithDialog = (( endpoint: string, data: Record<string, any> = {}, - token?: string | null | undefined + token?: string | null | undefined, ) => { const promise = api(endpoint, data, token); promiseDialog(promise, null, (err) => { @@ -130,7 +127,7 @@ export function promiseDialog<T extends Promise<any>>( promise: T, onSuccess?: ((res: any) => void) | null, onFailure?: ((err: Error) => void) | null, - text?: string + text?: string, ): T { const showing = ref(true); const success = ref(false); @@ -168,7 +165,7 @@ export function promiseDialog<T extends Promise<any>>( text: text, }, {}, - "closed" + "closed", ); return promise; @@ -189,7 +186,7 @@ const zIndexes = { high: 3000000, }; export function claimZIndex( - priority: "low" | "middle" | "high" = "low" + priority: "low" | "middle" | "high" = "low", ): number { zIndexes[priority] += 100; return zIndexes[priority]; @@ -204,7 +201,7 @@ export async function popup( component: Component, props: Record<string, any>, events = {}, - disposeEvent?: string + disposeEvent?: string, ) { markRaw(component); @@ -245,7 +242,7 @@ export function pageWindow(path: string) { initialPath: path, }, {}, - "closed" + "closed", ); } @@ -260,7 +257,7 @@ export function modalPageWindow(path: string) { initialPath: path, }, {}, - "closed" + "closed", ); } @@ -271,7 +268,7 @@ export function toast(message: string) { message, }, {}, - "closed" + "closed", ); } @@ -292,7 +289,7 @@ export function alert(props: { resolve(); }, }, - "closed" + "closed", ); }); } @@ -316,7 +313,7 @@ export function confirm(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -343,7 +340,7 @@ export function yesno(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -384,7 +381,7 @@ export function inputText(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -422,7 +419,7 @@ export function inputParagraph(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -462,7 +459,7 @@ export function inputNumber(props: { resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -499,11 +496,11 @@ export function inputDate(props: { result: new Date(result.result), canceled: false, } - : { canceled: true } + : { canceled: true }, ); }, }, - "closed" + "closed", ); }); } @@ -529,7 +526,7 @@ export function select<C = any>( }[]; }[]; } - ) + ), ): Promise< | { canceled: true; result: undefined } | { @@ -554,7 +551,7 @@ export function select<C = any>( resolve(result ? result : { canceled: true }); }, }, - "closed" + "closed", ); }); } @@ -574,7 +571,7 @@ export function success(): Promise<void> { { done: () => resolve(), }, - "closed" + "closed", ); }); } @@ -591,7 +588,7 @@ export function waiting(): Promise<void> { { done: () => resolve(), }, - "closed" + "closed", ); }); } @@ -610,7 +607,7 @@ export function form(title, form) { resolve(result); }, }, - "closed" + "closed", ); }); } @@ -629,7 +626,26 @@ export async function selectUser() { resolve(user); }, }, - "closed" + "closed", + ); + }); +} + +export async function selectLocalUser() { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkUserSelectLocalDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + {}, + { + ok: (user) => { + resolve(user); + }, + }, + "closed", ); }); } @@ -648,7 +664,7 @@ export async function selectInstance(): Promise<Misskey.entities.Instance> { resolve(instance); }, }, - "closed" + "closed", ); }); } @@ -672,7 +688,7 @@ export async function selectDriveFile(multiple: boolean) { } }, }, - "closed" + "closed", ); }); } @@ -696,7 +712,7 @@ export async function selectDriveFolder(multiple: boolean) { } }, }, - "closed" + "closed", ); }); } @@ -718,7 +734,7 @@ export async function pickEmoji(src: HTMLElement | null, opts) { resolve(emoji); }, }, - "closed" + "closed", ); }); } @@ -727,7 +743,7 @@ export async function cropImage( image: Misskey.entities.DriveFile, options: { aspectRatio: number; - } + }, ): Promise<Misskey.entities.DriveFile> { return new Promise((resolve, reject) => { popup( @@ -745,7 +761,7 @@ export async function cropImage( resolve(x); }, }, - "closed" + "closed", ); }); } @@ -760,7 +776,7 @@ let activeTextarea: HTMLTextAreaElement | HTMLInputElement | null = null; export async function openEmojiPicker( src?: HTMLElement, opts, - initialTextarea: typeof activeTextarea + initialTextarea: typeof activeTextarea, ) { if (openingEmojiPicker) return; @@ -776,14 +792,13 @@ export async function openEmojiPicker( const observer = new MutationObserver((records) => { for (const record of records) { for (const node of Array.from(record.addedNodes).filter( - (node) => node instanceof HTMLElement + (node) => node instanceof HTMLElement, ) as HTMLElement[]) { const textareas = node.querySelectorAll("textarea, input"); for (const textarea of Array.from(textareas).filter( - (textarea) => textarea.dataset.preventEmojiInsert == null + (textarea) => textarea.dataset.preventEmojiInsert == null, )) { - if (document.activeElement === textarea) - activeTextarea = textarea; + if (document.activeElement === textarea) activeTextarea = textarea; textarea.addEventListener("focus", () => { activeTextarea = textarea; }); @@ -821,7 +836,7 @@ export async function openEmojiPicker( openingEmojiPicker = null; observer.disconnect(); }, - } + }, ); } @@ -833,7 +848,7 @@ export function popupMenu( width?: number; viaKeyboard?: boolean; noReturnFocus?: boolean; - } + }, ) { return new Promise((resolve, reject) => { let dispose; @@ -856,7 +871,7 @@ export function popupMenu( resolve(); dispose(); }, - } + }, ).then((res) => { dispose = res.dispose; }); @@ -865,7 +880,7 @@ export function popupMenu( export function contextMenu( items: MenuItem[] | Ref<MenuItem[]>, - ev: MouseEvent + ev: MouseEvent, ) { ev.preventDefault(); return new Promise((resolve, reject) => { @@ -885,7 +900,7 @@ export function contextMenu( resolve(); dispose(); }, - } + }, ).then((res) => { dispose = res.dispose; }); diff --git a/packages/client/src/pages/about-calckey.vue b/packages/client/src/pages/about-calckey.vue index 1e16356a51..6899c4de0f 100644 --- a/packages/client/src/pages/about-calckey.vue +++ b/packages/client/src/pages/about-calckey.vue @@ -97,13 +97,16 @@ ><Mfm :text="'$[sparkle @kainoa@calckey.social] (Main developer)'" /></FormLink> - <FormLink to="/@april@calckey.social" - ><Mfm :text="'@april@calckey.social (Backend)'" - /></FormLink> <FormLink to="/@freeplay@calckey.social" ><Mfm :text="'@freeplay@calckey.social (UI/UX)'" /></FormLink> + <FormLink to="/@nmkj@calckey.jp" + ><Mfm :text="'@nmkj@calckey.jp (Backend)'" + /></FormLink> + <FormLink to="/@dev@post.naskya.net" + ><Mfm :text="'@dev@post.naskya.net (Backend)'" + /></FormLink> <FormLink to="/@panos@calckey.social" ><Mfm :text="'@panos@calckey.social (Project Coordinator)'" @@ -128,6 +131,9 @@ ><Mfm text="$[jelly ❤]" /> {{ i18n.ts._aboutMisskey.patrons }}</template > + <p> + {{ i18n.ts._aboutMisskey.patronsList }} + </p> <MkSparkle> <span v-for="patron in patrons" @@ -164,7 +170,12 @@ import { defaultStore } from "@/store"; import * as os from "@/os"; import { definePageMetadata } from "@/scripts/page-metadata"; -const patrons = await os.api("patrons"); +let patrons = []; +try { + patrons = await os.api("patrons", { forceUpdate: true }); +} catch { + console.error("Codeberg's down."); +} let easterEggReady = false; let easterEggEmojis = $ref([]); diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue index 3e951c00b1..205f86cd48 100644 --- a/packages/client/src/pages/about.vue +++ b/packages/client/src/pages/about.vue @@ -16,10 +16,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" @@ -53,9 +52,9 @@ <MkKeyValue class="_formBlock"> <template #key>{{ i18n.ts.description }}</template> - <template #value>{{ - $instance.description - }}</template> + <template #value + ><div v-html="$instance.description"></div + ></template> </MkKeyValue> <FormSection> diff --git a/packages/client/src/pages/admin-file.vue b/packages/client/src/pages/admin-file.vue index 63a8132861..de47377043 100644 --- a/packages/client/src/pages/admin-file.vue +++ b/packages/client/src/pages/admin-file.vue @@ -16,10 +16,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" diff --git a/packages/client/src/pages/admin/experiments.vue b/packages/client/src/pages/admin/experiments.vue index 0c9a258cb4..32ce9bfae8 100644 --- a/packages/client/src/pages/admin/experiments.vue +++ b/packages/client/src/pages/admin/experiments.vue @@ -8,19 +8,6 @@ /></template> <MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> <FormSuspense :p="init"> - <FormSwitch - v-model="enablePostEditing" - @update:modelValue="save" - class="_formBlock" - > - <template #label> - <i class="ph-pencil-line ph-bold ph-lg"></i> - {{ i18n.ts._experiments.enablePostEditing }} - </template> - <template #caption>{{ - i18n.ts._experiments.postEditingCaption - }}</template> - </FormSwitch> <FormSwitch v-model="enablePostImports" @update:modelValue="save" @@ -49,13 +36,11 @@ import { fetchInstance } from "@/instance"; import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; -let enablePostEditing = $ref(false); let enablePostImports = $ref(false); let meta = $ref<MetaExperiments | null>(null); type MetaExperiments = { experimentalFeatures?: { - postEditing?: boolean; postImports?: boolean; }; }; @@ -64,14 +49,12 @@ async function init() { meta = (await os.api("admin/meta")) as MetaExperiments; if (!meta) return; - enablePostEditing = meta.experimentalFeatures?.postEditing ?? false; enablePostImports = meta.experimentalFeatures?.postImports ?? false; } function save() { const experiments: MetaExperiments = { experimentalFeatures: { - postEditing: enablePostEditing, postImports: enablePostImports, }, }; diff --git a/packages/client/src/pages/admin/index.vue b/packages/client/src/pages/admin/index.vue index ddc5fc6800..e6932fb86b 100644 --- a/packages/client/src/pages/admin/index.vue +++ b/packages/client/src/pages/admin/index.vue @@ -201,7 +201,7 @@ const menuDef = $computed(() => [ active: currentPage?.route.name === "federation", }, { - icon: "ph-clipboard-text ph-bold ph-lg", + icon: "ph-queue ph-bold ph-lg", text: i18n.ts.jobQueue, to: "/admin/queue", active: currentPage?.route.name === "queue", diff --git a/packages/client/src/pages/admin/overview.stats.vue b/packages/client/src/pages/admin/overview.stats.vue index b6d9e0bf14..172e346e70 100644 --- a/packages/client/src/pages/admin/overview.stats.vue +++ b/packages/client/src/pages/admin/overview.stats.vue @@ -22,7 +22,7 @@ :value="usersComparedToThePrevDay" ></MkNumberDiff> </div> - <div class="label">Users</div> + <div class="label">{{ i18n.ts.users }}</div> </div> </div> <div class="item _panel notes"> @@ -41,7 +41,7 @@ :value="notesComparedToThePrevDay" ></MkNumberDiff> </div> - <div class="label">Posts</div> + <div class="label">{{ i18n.ts.notes }}</div> </div> </div> <div class="item _panel instances"> @@ -55,7 +55,7 @@ style="margin-right: 0.5em" /> </div> - <div class="label">Instances</div> + <div class="label">{{ i18n.ts.instances }}</div> </div> </div> <div class="item _panel online"> @@ -69,10 +69,26 @@ style="margin-right: 0.5em" /> </div> - <div class="label">Online</div> + <div class="label">{{ i18n.ts.online }}</div> + </div> + </div> + <div class="item _panel emojis"> + <div class="icon"> + <i class="ph-smiley ph-bold ph-xl"></i> + </div> + <div class="body"> + <div class="value"> + <MkNumber + :value="emojiCount" + style="margin-right: 0.5em" + /> + </div> + <div class="label">{{ i18n.ts.emojis }}</div> </div> </div> </div> + + <!-- TODO: Drive --> </Transition> </div> </template> @@ -90,6 +106,7 @@ let stats: any = $ref(null); let usersComparedToThePrevDay = $ref<number>(); let notesComparedToThePrevDay = $ref<number>(); let onlineUsersCount = $ref(0); +let emojiCount = $ref(0); let fetching = $ref(true); onMounted(async () => { @@ -110,6 +127,10 @@ onMounted(async () => { stats.originalNotesCount - chart.local.total[1]; }); + os.api("meta", { detail: false }).then((meta) => { + emojiCount = meta.emojis.length; + }); + fetching = false; }); </script> @@ -172,6 +193,13 @@ onMounted(async () => { } } + &.drive { + > .icon { + background: #b4637a22; + color: #eb6f92; + } + } + > .body { padding: 2px 0; diff --git a/packages/client/src/pages/admin/proxy-account.vue b/packages/client/src/pages/admin/proxy-account.vue index 87b3c684e2..7d72b0ac0f 100644 --- a/packages/client/src/pages/admin/proxy-account.vue +++ b/packages/client/src/pages/admin/proxy-account.vue @@ -20,12 +20,15 @@ }}</template> </MkKeyValue> - <FormButton + <MkButton primary class="_formBlock" @click="chooseProxyAccount" - >{{ i18n.ts.selectAccount }}</FormButton + >{{ i18n.ts.selectAccount }}</MkButton > + <MkButton danger class="_formBlock" @click="del">{{ + i18n.ts.remove + }}</MkButton> </FormSuspense> </MkSpacer> </MkStickyContainer> @@ -34,7 +37,7 @@ <script lang="ts" setup> import {} from "vue"; import MkKeyValue from "@/components/MkKeyValue.vue"; -import FormButton from "@/components/MkButton.vue"; +import MkButton from "@/components/MkButton.vue"; import MkInfo from "@/components/MkInfo.vue"; import FormSuspense from "@/components/form/suspense.vue"; import * as os from "@/os"; @@ -54,7 +57,7 @@ async function init() { } function chooseProxyAccount() { - os.selectUser().then((user) => { + os.selectLocalUser().then((user) => { proxyAccount = user; proxyAccountId = user.id; save(); @@ -69,6 +72,14 @@ function save() { }); } +function del() { + os.apiWithDialog("admin/update-meta", { + proxyAccountId: null, + }).then(() => { + fetchInstance(); + }); +} + const headerActions = $computed(() => []); const headerTabs = $computed(() => []); diff --git a/packages/client/src/pages/admin/queue.chart.vue b/packages/client/src/pages/admin/queue.chart.vue index e9d0f0655e..ee4f3724cb 100644 --- a/packages/client/src/pages/admin/queue.chart.vue +++ b/packages/client/src/pages/admin/queue.chart.vue @@ -41,7 +41,12 @@ <div class="jobs"> <div v-if="jobs.length > 0"> <div v-for="job in jobs" :key="job[0]"> - <span>{{ job[0] }}</span> + <a + @click.stop="os.pageWindow(`/instance-info/${job[0]}`)" + class="_link" + > + {{ job[0] }} + </a> <span style="margin-left: 8px; opacity: 0.7" >({{ number(job[1]) }} jobs)</span > diff --git a/packages/client/src/pages/admin/queue.vue b/packages/client/src/pages/admin/queue.vue index b43da1f0a7..b8920f332a 100644 --- a/packages/client/src/pages/admin/queue.vue +++ b/packages/client/src/pages/admin/queue.vue @@ -63,6 +63,6 @@ const headerTabs = $computed(() => [ definePageMetadata({ title: i18n.ts.jobQueue, - icon: "ph-clipboard-text ph-bold ph-lg", + icon: "ph-queue ph-bold ph-lg", }); </script> diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index feedaff6d5..5108c06965 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -130,25 +130,13 @@ i18n.ts.defaultReaction }}</template> <option value="⭐"> - <MkEmoji - class="emoji" - emoji="⭐" - style="height: 1.7em" - /> + <MkEmoji emoji="⭐" style="height: 1.7em" /> </option> <option value="👍"> - <MkEmoji - class="emoji" - emoji="👍" - style="height: 1.7em" - /> + <MkEmoji emoji="👍" style="height: 1.7em" /> </option> <option value="❤️"> - <MkEmoji - class="emoji" - emoji="❤️" - style="height: 1.7em" - /> + <MkEmoji emoji="❤️" style="height: 1.7em" /> </option> <option value="custom"> <FormInput @@ -355,6 +343,27 @@ </template> </FormSection> + <FormSection> + <template #label>Server Performance</template> + <FormSwitch + v-model="enableServerMachineStats" + class="_formBlock" + > + <template #label>{{ + i18n.ts.enableServerMachineStats + }}</template> + </FormSwitch> + + <FormSwitch + v-model="enableIdenticonGeneration" + class="_formBlock" + > + <template #label>{{ + i18n.ts.enableIdenticonGeneration + }}</template> + </FormSwitch> + </FormSection> + <FormSection> <template #label>DeepL Translation</template> @@ -454,6 +463,8 @@ let libreTranslateApiUrl: string = $ref(""); let libreTranslateApiKey: string = $ref(""); let defaultReaction: string = $ref(""); let defaultReactionCustom: string = $ref(""); +let enableServerMachineStats: boolean = $ref(false); +let enableIdenticonGeneration: boolean = $ref(false); async function init() { const meta = await os.api("admin/meta"); @@ -494,6 +505,8 @@ async function init() { defaultReactionCustom = ["⭐", "👍", "❤️"].includes(meta.defaultReaction) ? "" : meta.defaultReaction; + enableServerMachineStats = meta.enableServerMachineStats; + enableIdenticonGeneration = meta.enableIdenticonGeneration; } function save() { @@ -533,6 +546,8 @@ function save() { libreTranslateApiUrl, libreTranslateApiKey, defaultReaction, + enableServerMachineStats, + enableIdenticonGeneration, }).then(() => { fetchInstance(); }); diff --git a/packages/client/src/pages/antenna-timeline.vue b/packages/client/src/pages/antenna-timeline.vue index 3bfa972085..a99ba68724 100644 --- a/packages/client/src/pages/antenna-timeline.vue +++ b/packages/client/src/pages/antenna-timeline.vue @@ -9,11 +9,6 @@ v-size="{ min: [800] }" class="tqmomfks" > - <div v-if="queue > 0" class="new"> - <button class="_buttonPrimary" @click="top()"> - {{ i18n.ts.newNoteRecived }} - </button> - </div> <div class="tl _block"> <XTimeline ref="tlEl" @@ -22,7 +17,6 @@ src="antenna" :antenna="antennaId" :sound="true" - @queue="queueUpdated" /> </div> </div> @@ -32,7 +26,6 @@ <script lang="ts" setup> import { computed, inject, watch } from "vue"; import XTimeline from "@/components/MkTimeline.vue"; -import { scroll } from "@/scripts/scroll"; import * as os from "@/os"; import { useRouter } from "@/router"; import { definePageMetadata } from "@/scripts/page-metadata"; @@ -45,21 +38,12 @@ const props = defineProps<{ }>(); let antenna = $ref(null); -let queue = $ref(0); let rootEl = $ref<HTMLElement>(); let tlEl = $ref<InstanceType<typeof XTimeline>>(); const keymap = $computed(() => ({ t: focus, })); -function queueUpdated(q) { - queue = q; -} - -function top() { - scroll(rootEl, { top: 0 }); -} - async function timetravel() { const { canceled, result: date } = await os.inputDate({ title: i18n.ts.date, @@ -143,24 +127,9 @@ definePageMetadata( .tqmomfks { padding: var(--margin); - > .new { - position: sticky; - top: calc(var(--stickyTop, 0px) + 16px); - z-index: 1000; - width: 100%; - - > button { - display: block; - margin: var(--margin) auto 0 auto; - padding: 8px 16px; - border-radius: 32px; - } - } - > .tl { background: none; border-radius: var(--radius); - overflow: clip; } &.min-width_800px { diff --git a/packages/client/src/pages/channels.vue b/packages/client/src/pages/channels.vue index b79985bafb..c871655b67 100644 --- a/packages/client/src/pages/channels.vue +++ b/packages/client/src/pages/channels.vue @@ -19,10 +19,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" diff --git a/packages/client/src/pages/explore.vue b/packages/client/src/pages/explore.vue index 9202d78878..b23998c417 100644 --- a/packages/client/src/pages/explore.vue +++ b/packages/client/src/pages/explore.vue @@ -17,10 +17,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" diff --git a/packages/client/src/pages/gallery/index.vue b/packages/client/src/pages/gallery/index.vue index 92fb22354b..aa9141acc7 100644 --- a/packages/client/src/pages/gallery/index.vue +++ b/packages/client/src/pages/gallery/index.vue @@ -17,10 +17,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" diff --git a/packages/client/src/pages/instance-info.vue b/packages/client/src/pages/instance-info.vue index 73c1051e1f..111717459d 100644 --- a/packages/client/src/pages/instance-info.vue +++ b/packages/client/src/pages/instance-info.vue @@ -21,10 +21,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" diff --git a/packages/client/src/pages/messaging/index.vue b/packages/client/src/pages/messaging/index.vue index ba385e3958..0e3ea6e42a 100644 --- a/packages/client/src/pages/messaging/index.vue +++ b/packages/client/src/pages/messaging/index.vue @@ -17,10 +17,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" diff --git a/packages/client/src/pages/mfm-cheat-sheet.vue b/packages/client/src/pages/mfm-cheat-sheet.vue index c17ac08043..bf85af4302 100644 --- a/packages/client/src/pages/mfm-cheat-sheet.vue +++ b/packages/client/src/pages/mfm-cheat-sheet.vue @@ -460,8 +460,12 @@ let preview_emoji = $ref( instance.emojis.length ? `:${instance.emojis[0].name}:` : ":emojiname:" ); let preview_bold = $ref(`**${i18n.ts._mfm.dummy}**`); -let preview_small = $ref(`<small>${i18n.ts._mfm.dummy}</small>`); -let preview_center = $ref(`<center>${i18n.ts._mfm.dummy}</center>`); +let preview_small = $ref( + `<small>${i18n.ts._mfm.dummy}</small> $[small ${i18n.ts._mfm.dummy}]` +); +let preview_center = $ref( + `<center>${i18n.ts._mfm.dummy}</center> $[center ${i18n.ts._mfm.dummy}]` +); let preview_inlineCode = $ref('`<: "Hello, world!"`'); let preview_blockCode = $ref( '```\n~ (#i, 100) {\n\t<: ? ((i % 15) = 0) "FizzBuzz"\n\t\t.? ((i % 3) = 0) "Fizz"\n\t\t.? ((i % 5) = 0) "Buzz"\n\t\t. i\n}\n```' diff --git a/packages/client/src/pages/miauth.vue b/packages/client/src/pages/miauth.vue index bf4c2542fb..768787ef26 100644 --- a/packages/client/src/pages/miauth.vue +++ b/packages/client/src/pages/miauth.vue @@ -28,11 +28,38 @@ </div> <div class="_content"> <p>{{ i18n.ts._auth.permissionAsk }}</p> - <ul> - <li v-for="p in _permissions" :key="p"> + <div + v-if="_permissions.length === 32" + :class="[$style.permissions]" + > + <div + :class="[$style.permission]" + style=" + background-color: var(--error); + color: var(--fgOnAccent); + " + > + <i + class="ph-shield-warning ph-bold ph-xl" + style="margin-right: 0.5rem" + ></i> + {{ i18n.ts._permissions.allPermissions }} + </div> + </div> + <div v-else :class="[$style.permissions]"> + <div + v-for="p in _permissions" + :key="p" + :class="[$style.permission]" + > + <i + :class="[`ph-${getIcon(p)}`]" + class="ph-bold ph-xl" + style="margin-right: 0.5rem" + ></i> {{ i18n.t(`_permissions.${p}`) }} - </li> - </ul> + </div> + </div> </div> <div class="_footer"> <MkButton inline @click="deny">{{ @@ -71,6 +98,10 @@ const _permissions = props.permission.split(","); let state = $ref<string | null>(null); +function getIcon(p: string) { + return p.includes("write") ? "pencil-simple" : "eye"; +} + async function accept(): Promise<void> { state = "waiting"; await os.api("miauth/gen-token", { @@ -107,4 +138,19 @@ function onLogin(res): void { } </script> -<style lang="scss" scoped></style> +<style lang="scss" module> +.permissions { + display: flex; + flex-wrap: wrap; + gap: 1rem; + margin-bottom: 2rem; +} + +.permission { + display: inline-flex; + padding: 0.5rem 1rem; + border-radius: var(--radius); + background-color: var(--buttonBg); + color: var(--fg); +} +</style> diff --git a/packages/client/src/pages/my-groups/group.vue b/packages/client/src/pages/my-groups/group.vue index 192572db1e..e6c7db1fb0 100644 --- a/packages/client/src/pages/my-groups/group.vue +++ b/packages/client/src/pages/my-groups/group.vue @@ -77,7 +77,7 @@ async function fetch() { fetch(); function invite() { - os.selectUser().then((user) => { + os.selectLocalUser().then((user) => { os.apiWithDialog("users/groups/invite", { groupId: group.value.id, userId: user.id, @@ -110,7 +110,7 @@ async function renameGroup() { } function transfer() { - os.selectUser().then((user) => { + os.selectLocalUser().then((user) => { os.apiWithDialog("users/groups/transfer", { groupId: group.value.id, userId: user.id, diff --git a/packages/client/src/pages/notifications.vue b/packages/client/src/pages/notifications.vue index bda42a8b4a..37548c9802 100644 --- a/packages/client/src/pages/notifications.vue +++ b/packages/client/src/pages/notifications.vue @@ -18,10 +18,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" diff --git a/packages/client/src/pages/pages.vue b/packages/client/src/pages/pages.vue index 1724ab27f0..36fd6c0d76 100644 --- a/packages/client/src/pages/pages.vue +++ b/packages/client/src/pages/pages.vue @@ -16,10 +16,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" diff --git a/packages/client/src/pages/search.vue b/packages/client/src/pages/search.vue index e03956cc75..4604c69f76 100644 --- a/packages/client/src/pages/search.vue +++ b/packages/client/src/pages/search.vue @@ -17,10 +17,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" @@ -49,6 +48,7 @@ import XUserList from "@/components/MkUserList.vue"; import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; import { defaultStore } from "@/store"; +import { deviceKind } from "@/scripts/device-kind"; import "swiper/scss"; import "swiper/scss/virtual"; diff --git a/packages/client/src/pages/settings/2fa.qrdialog.vue b/packages/client/src/pages/settings/2fa.qrdialog.vue index f6e6e35953..5f14d069eb 100644 --- a/packages/client/src/pages/settings/2fa.qrdialog.vue +++ b/packages/client/src/pages/settings/2fa.qrdialog.vue @@ -35,7 +35,7 @@ <a :href="twoFactorData.url" ><img :class="$style.qr" :src="twoFactorData.qr" /></a> - <div style="max-width: 600px"> + <div style="max-width: 610px"> <MkKeyValue :copy="twoFactorData.url"> <template #key>{{ i18n.ts._2fa.step2Url }}</template> <template #value>{{ twoFactorData.url }}</template> @@ -94,5 +94,7 @@ const ok = () => { .qr { width: 20em; max-width: 100%; + border-radius: 10px; + border: 3px solid var(--accent); } </style> diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue index 45915d965d..f108572f99 100644 --- a/packages/client/src/pages/settings/2fa.vue +++ b/packages/client/src/pages/settings/2fa.vue @@ -5,7 +5,10 @@ <div v-if="$i" class="_gaps_s"> <MkFolder> <template #icon - ><i class="ph-shield-check ph-bold ph-lg"></i + ><i + class="ph-shield-check ph-bold ph-lg" + style="margin-right: 0.5rem" + ></i ></template> <template #label>{{ i18n.ts.totp }}</template> <template #caption>{{ i18n.ts.totpDescription }}</template> @@ -13,13 +16,19 @@ <div v-text="i18n.ts._2fa.alreadyRegistered" /> <template v-if="$i.securityKeysList.length > 0"> <MkButton @click="renewTOTP" - ><i class="ph-shield-check ph-bold ph-lg"></i + ><i + class="ph-shield-check ph-bold ph-lg" + style="margin-right: 0.5rem" + ></i >{{ i18n.ts._2fa.renewTOTP }}</MkButton > <MkInfo>{{ i18n.ts._2fa.whyTOTPOnlyRenew }}</MkInfo> </template> <MkButton v-else @click="unregisterTOTP" - ><i class="ph-shield-slash ph-bold ph-lg"></i + ><i + class="ph-shield-slash ph-bold ph-lg" + style="margin-right: 0.5rem" + ></i >{{ i18n.ts.unregister }}</MkButton > </div> @@ -32,7 +41,12 @@ </MkFolder> <MkFolder> - <template #icon><i class="ph-key ph-bold ph-lg"></i></template> + <template #icon + ><i + class="ph-key ph-bold ph-lg" + style="margin-right: 0.5rem" + ></i + ></template> <template #label>{{ i18n.ts.securityKeyAndPasskey }}</template> <div class="_gaps_s"> <MkInfo> @@ -54,23 +68,21 @@ <template v-else> <MkButton primary @click="addSecurityKey" - ><i class="ph-key ph-bold ph-lg"></i + ><i + class="ph-key ph-bold ph-lg" + style="margin-right: 0.5rem" + ></i >{{ i18n.ts._2fa.registerSecurityKey }}</MkButton > <MkFolder v-for="key in $i.securityKeysList" :key="key.id" > - <template #label>{{ key.name }}</template> - <template #suffix - ><I18n :src="i18n.ts.lastUsedAt" - ><template #t - ><MkTime - :time=" - key.lastUsed - " /></template></I18n - ></template> - <div class="_buttons"> + <h3>{{ key.name }}</h3> + <p> + {{ `${i18n.ts.lastUsedDate}: ${key.lastUsed}` }} + </p> + <div class="_buttons _flexList"> <MkButton @click="renameKey(key)" ><i class="ph-pencil-line ph-bold ph-lg" @@ -159,7 +171,7 @@ async function registerTOTP() { }); if (!qrdialog) return; - const token = await os.inputNumber({ + const token = await os.inputText({ title: i18n.ts._2fa.step3Title, text: i18n.ts._2fa.step3, autocomplete: "one-time-code", @@ -167,7 +179,7 @@ async function registerTOTP() { if (token.canceled) return; await os.apiWithDialog("i/2fa/done", { - token: token.result.toString(), + token: token.result, }); await os.alert({ diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue index 36a4e2a13c..3a3bf6bb1d 100644 --- a/packages/client/src/pages/settings/general.vue +++ b/packages/client/src/pages/settings/general.vue @@ -45,9 +45,18 @@ class="_formBlock" >{{ i18n.ts.useReactionPickerForContextMenu }}</FormSwitch > - <FormSwitch v-model="swipeOnDesktop" class="_formBlock">{{ - i18n.ts.swipeOnDesktop - }}</FormSwitch> + <FormSwitch + v-if="deviceKind !== 'desktop'" + v-model="swipeOnMobile" + class="_formBlock" + >{{ i18n.ts.swipeOnMobile }}</FormSwitch + > + <FormSwitch + v-if="deviceKind === 'desktop'" + v-model="swipeOnDesktop" + class="_formBlock" + >{{ i18n.ts.swipeOnDesktop }}</FormSwitch + > <FormSwitch v-model="enterSendsMessage" class="_formBlock">{{ i18n.ts.enterSendsMessage }}</FormSwitch> @@ -253,6 +262,7 @@ import * as os from "@/os"; import { unisonReload } from "@/scripts/unison-reload"; import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; +import { deviceKind } from "@/scripts/device-kind"; const lang = ref(localStorage.getItem("lang")); const fontSize = ref(localStorage.getItem("fontSize")); @@ -339,6 +349,7 @@ const showUpdates = computed(defaultStore.makeGetterSetter("showUpdates")); const swipeOnDesktop = computed( defaultStore.makeGetterSetter("swipeOnDesktop") ); +const swipeOnMobile = computed(defaultStore.makeGetterSetter("swipeOnMobile")); const showAdminUpdates = computed( defaultStore.makeGetterSetter("showAdminUpdates") ); @@ -346,6 +357,10 @@ const showTimelineReplies = computed( defaultStore.makeGetterSetter("showTimelineReplies") ); +watch(swipeOnDesktop, () => { + defaultStore.set("swipeOnMobile", true); +}); + watch(lang, () => { localStorage.setItem("lang", lang.value as string); localStorage.removeItem("locale"); @@ -379,6 +394,7 @@ watch( overridedDeviceKind, showAds, showUpdates, + swipeOnMobile, swipeOnDesktop, seperateRenoteQuote, showAdminUpdates, diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue index 25e8a33318..429186c340 100644 --- a/packages/client/src/pages/settings/index.vue +++ b/packages/client/src/pages/settings/index.vue @@ -331,6 +331,11 @@ definePageMetadata(INFO); <style lang="scss" scoped> .vvcocwet { > .body { + .wallpaper & { + background: var(--bg); + padding: var(--margin); + border-radius: var(--radius); + } > .nav { .baaadecd { > .info { diff --git a/packages/client/src/pages/settings/preferences-backups.vue b/packages/client/src/pages/settings/preferences-backups.vue index 313024d869..15fd804bf9 100644 --- a/packages/client/src/pages/settings/preferences-backups.vue +++ b/packages/client/src/pages/settings/preferences-backups.vue @@ -110,6 +110,7 @@ const defaultStoreSaveKeys: (keyof (typeof defaultStore)["state"])[] = [ "squareAvatars", "numberOfPageCache", "showUpdates", + "swipeOnMobile", "swipeOnDesktop", "showAdminUpdates", "enableCustomKaTeXMacro", diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue index d8578a6f7f..9f6d264079 100644 --- a/packages/client/src/pages/settings/reaction.vue +++ b/packages/client/src/pages/settings/reaction.vue @@ -23,7 +23,11 @@ class="_button item" @click="remove(element, $event)" > - <MkEmoji :emoji="element" :normal="true" /> + <MkEmoji + :emoji="element" + style="height: 1.7em" + class="emoji" + /> </button> </template> <template #footer> @@ -41,6 +45,27 @@ > </FromSlot> + <FormRadios v-model="reactionPickerSkinTone" class="_formBlock"> + <template #label>{{ i18n.ts.reactionPickerSkinTone }}</template> + <option :value="1" :aria-label="i18n.ts._skinTones.yellow"> + <MkEmoji style="height: 1.7em" emoji="✌️" /> + </option> + <option :value="6" :aria-label="i18n.ts._skinTones.dark"> + <MkEmoji style="height: 1.7em" emoji="✌🏿" /> + </option> + <option :value="5" :aria-label="i18n.ts._skinTones.mediumDark"> + <MkEmoji style="height: 1.7em" emoji="✌🏾" /> + </option> + <option :value="4" :aria-label="i18n.ts._skinTones.medium"> + <MkEmoji style="height: 1.7em" emoji="✌🏽" /> + </option> + <option :value="3" :aria-label="i18n.ts._skinTones.mediumLight"> + <MkEmoji style="height: 1.7em" emoji="✌🏼" /> + </option> + <option :value="2" :aria-label="i18n.ts._skinTones.light"> + <MkEmoji style="height: 1.7em" emoji="✌🏻" /> + </option> + </FormRadios> <FormRadios v-model="reactionPickerSize" class="_formBlock"> <template #label>{{ i18n.ts.size }}</template> <option :value="1">{{ i18n.ts.small }}</option> @@ -112,6 +137,7 @@ import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; import { deepClone } from "@/scripts/clone"; import { unisonReload } from "@/scripts/unison-reload"; +import { addSkinTone } from "@/scripts/emojilist"; async function reloadAsk() { const { canceled } = await os.confirm({ @@ -125,6 +151,9 @@ async function reloadAsk() { let reactions = $ref(deepClone(defaultStore.state.reactions)); +const reactionPickerSkinTone = $computed( + defaultStore.makeGetterSetter("reactionPickerSkinTone") +); const reactionPickerSize = $computed( defaultStore.makeGetterSetter("reactionPickerSize") ); @@ -210,6 +239,13 @@ watch(enableEmojiReactions, async () => { await reloadAsk(); }); +watch(reactionPickerSkinTone, async () => { + reactions.forEach((emoji) => { + addSkinTone(emoji, reactionPickerSkinTone.value); + }); + await reloadAsk(); +}); + const headerActions = $computed(() => []); const headerTabs = $computed(() => []); diff --git a/packages/client/src/pages/tag.vue b/packages/client/src/pages/tag.vue index 18561d9648..ce353457d0 100644 --- a/packages/client/src/pages/tag.vue +++ b/packages/client/src/pages/tag.vue @@ -17,10 +17,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" @@ -49,6 +48,7 @@ import XUserList from "@/components/MkUserList.vue"; import { i18n } from "@/i18n"; import { definePageMetadata } from "@/scripts/page-metadata"; import { defaultStore } from "@/store"; +import { deviceKind } from "@/scripts/device-kind"; import "swiper/scss"; import "swiper/scss/virtual"; diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index 8aec6496d9..479d836eb1 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -15,12 +15,6 @@ class="post-form _block" fixed /> - - <div v-if="queue > 0" class="new"> - <button class="_buttonPrimary" @click="top()"> - {{ i18n.ts.newNoteRecived }} - </button> - </div> <!-- <div v-if="!isMobile" class="tl _block"> <XTimeline ref="tl" @@ -41,10 +35,9 @@ :space-between="20" :virtual="true" :allow-touch-move=" - !( - deviceKind === 'desktop' && - !defaultStore.state.swipeOnDesktop - ) + defaultStore.state.swipeOnMobile && + (deviceKind !== 'desktop' || + defaultStore.state.swipeOnDesktop) " @swiper="setSwiperRef" @slide-change="onSlideChange" @@ -61,7 +54,6 @@ class="tl" :src="src" :sound="true" - @queue="queueUpdated" /> </swiper-slide> </swiper> @@ -72,13 +64,12 @@ </template> <script lang="ts" setup> -import { computed, watch, ref, onMounted } from "vue"; +import { computed, ref, onMounted } from "vue"; import { Virtual } from "swiper"; import { Swiper, SwiperSlide } from "swiper/vue"; import XTutorial from "@/components/MkTutorialDialog.vue"; import XTimeline from "@/components/MkTimeline.vue"; import XPostForm from "@/components/MkPostForm.vue"; -import { scroll } from "@/scripts/scroll"; import * as os from "@/os"; import { defaultStore } from "@/store"; import { i18n } from "@/i18n"; @@ -133,7 +124,6 @@ window.addEventListener("resize", () => { const tlComponent = $ref<InstanceType<typeof XTimeline>>(); const rootEl = $ref<HTMLElement>(); -let queue = $ref(0); const src = $computed({ get: () => defaultStore.reactiveState.tl.value.src, set: (x) => { @@ -142,16 +132,6 @@ const src = $computed({ }, }); -watch($$(src), () => (queue = 0)); - -function queueUpdated(q: number): void { - queue = q; -} - -function top(): void { - scroll(rootEl, { top: 0 }); -} - const lists = os.api("users/lists/list"); async function chooseList(ev: MouseEvent) { await lists.then((res) => { @@ -330,31 +310,8 @@ onMounted(() => { <style lang="scss" scoped> .cmuxhskf { --swiper-theme-color: var(--accent); - - > .new { - position: sticky; - top: calc(var(--stickyTop, 0px) + 16px); - z-index: 1000; - width: 100%; - pointer-events: none; - - > button { - display: block; - margin: var(--margin) auto 0 auto; - padding: 8px 16px; - border-radius: 32px; - pointer-events: all; - } - } - - > .post-form { - border-radius: var(--radius); - } - > .tl { background: none; - border-radius: var(--radius); - overflow: clip; } } </style> diff --git a/packages/client/src/pages/user-list-timeline.vue b/packages/client/src/pages/user-list-timeline.vue index 352e5d6838..839b1a6afa 100644 --- a/packages/client/src/pages/user-list-timeline.vue +++ b/packages/client/src/pages/user-list-timeline.vue @@ -4,11 +4,6 @@ ><MkPageHeader :actions="headerActions" :tabs="headerTabs" /></template> <div ref="rootEl" v-size="{ min: [800] }" class="eqqrhokj"> - <div v-if="queue > 0" class="new"> - <button class="_buttonPrimary" @click="top()"> - {{ i18n.ts.newNoteRecived }} - </button> - </div> <div class="tl _block"> <XTimeline ref="tlEl" @@ -17,7 +12,6 @@ src="list" :list="listId" :sound="true" - @queue="queueUpdated" /> </div> </div> @@ -27,7 +21,6 @@ <script lang="ts" setup> import { computed, watch, inject } from "vue"; import XTimeline from "@/components/MkTimeline.vue"; -import { scroll } from "@/scripts/scroll"; import * as os from "@/os"; import { useRouter } from "@/router"; import { definePageMetadata } from "@/scripts/page-metadata"; @@ -40,7 +33,6 @@ const props = defineProps<{ }>(); let list = $ref(null); -let queue = $ref(0); let tlEl = $ref<InstanceType<typeof XTimeline>>(); let rootEl = $ref<HTMLElement>(); @@ -54,14 +46,6 @@ watch( { immediate: true } ); -function queueUpdated(q) { - queue = q; -} - -function top() { - scroll(rootEl, { top: 0 }); -} - function settings() { router.push(`/my/lists/${props.listId}`); } @@ -109,25 +93,9 @@ definePageMetadata( <style lang="scss" scoped> .eqqrhokj { padding: var(--margin); - - > .new { - position: sticky; - top: calc(var(--stickyTop, 0px) + 16px); - z-index: 1000; - width: 100%; - - > button { - display: block; - margin: var(--margin) auto 0 auto; - padding: 8px 16px; - border-radius: 32px; - } - } - > .tl { background: none; border-radius: var(--radius); - overflow: clip; } &.min-width_800px { diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue index d02b6f665e..84aa3868cd 100644 --- a/packages/client/src/pages/user/home.vue +++ b/packages/client/src/pages/user/home.vue @@ -20,20 +20,48 @@ /> <div :key="user.id" class="_block main"> - <div class="banner-container" :style="style"> + <div class="banner-container"> <div ref="bannerEl" class="banner" - :style="style" + :style="{ + backgroundImage: `url('${user.bannerUrl}')`, + }" ></div> <div class="fade"></div> <div class="title"> - <div class="nameCollumn"> + <div class="nameColumn"> <MkUserName class="name" :user="user" :nowrap="true" /> + <div v-if="$i?.isModerator || $i?.isAdmin"> + <span + v-if="user.isSilenced" + style=" + color: var(--warn); + padding: 5px; + " + > + <i + class="ph-warning ph-bold ph-lg" + ></i> + {{ i18n.ts.silenced }} + </span> + <span + v-if="user.isSuspended" + style=" + color: var(--error); + padding: 5px; + " + > + <i + class="ph-warning ph-bold ph-lg" + ></i> + {{ i18n.ts.suspended }} + </span> + </div> <span v-if=" $i && @@ -98,7 +126,7 @@ :show-indicator="true" /> <div class="title"> - <div class="nameCollumn"> + <div class="nameColumn"> <MkUserName class="name" :user="user" @@ -113,20 +141,20 @@ class="followed" >{{ i18n.ts.followsYou }}</span > - <div - v-if="$i?.isModerator || $i?.isAdmin" - class="punishments" - > + <div v-if="$i?.isModerator || $i?.isAdmin"> <span - class="punished" v-if="user.isSilenced" + style="color: var(--warn); padding: 5px" > <i class="ph-warning ph-bold ph-lg"></i> {{ i18n.ts.silenced }} </span> <span - class="punished" v-if="user.isSuspended" + style=" + color: var(--error); + padding: 5px; + " > <i class="ph-warning ph-bold ph-lg"></i> {{ i18n.ts.suspended }} @@ -148,8 +176,13 @@ <span v-if="!user.isAdmin && user.isModerator" v-tooltip.noDelay="i18n.ts.isModerator" - style="color: var(--badge)" - ><i class="ph-bookmark-simple ph-bold"></i + style=" + color: var(--badge); + margin-left: 0.5rem; + " + ><i + class="ph-bookmark-simple ph-bold ph-lg" + ></i ></span> <span v-if="user.isLocked" @@ -374,13 +407,6 @@ let narrow = $ref<null | boolean>(null); let rootEl = $ref<null | HTMLElement>(null); let bannerEl = $ref<null | HTMLElement>(null); -const style = $computed(() => { - if (props.user.bannerUrl == null) return {}; - return { - backgroundImage: `url(${props.user.bannerUrl})`, - }; -}); - const age = $computed(() => { return calcAge(props.user.birthday); }); @@ -425,7 +451,12 @@ const timeForThem = $computed(() => { return ""; }); -const patrons = await os.api("patrons"); +let patrons = []; +try { + patrons = await os.api("patrons"); +} catch { + console.error("Codeberg's down."); +} function parallaxLoop() { parallaxAnimationId = window.requestAnimationFrame(parallaxLoop); @@ -471,7 +502,6 @@ onUnmounted(() => { overflow: hidden; background-size: cover; background-position: center; - > .banner { height: 100%; background-color: #26233a; @@ -479,17 +509,15 @@ onUnmounted(() => { background-position: center; box-shadow: 0 0 128px var(--shadow) inset; will-change: background-position; - - &::after { + &::before { content: ""; - background-image: var(--blur, inherit); position: fixed; inset: 0; + background: var(--blur, inherit); background-size: cover; background-position: center; pointer-events: none; - opacity: 0.1; - filter: var(--blur, blur(10px)); + filter: blur(12px) opacity(0.1); } } @@ -516,23 +544,6 @@ onUnmounted(() => { border-radius: 6px; } - > .punishments { - display: flex; - gap: 1rem; - margin-top: 0.5rem; - - > .punished { - padding: 10px; - color: var(--infoWarnBg); - background-color: var(--infoWarnFg); - border-radius: 10px; - - > i { - margin-right: 4px; - } - } - } - > .title { position: absolute; bottom: 0; @@ -542,7 +553,7 @@ onUnmounted(() => { box-sizing: border-box; color: #fff; - > .nameCollumn { + > .nameColumn { display: block; > .name { margin: 0; @@ -650,7 +661,7 @@ onUnmounted(() => { font-weight: bold; border-bottom: solid 0.5px var(--divider); - > .nameCollumn { + > .nameColumn { display: block; > .name { margin: 0; diff --git a/packages/client/src/scripts/emojilist.ts b/packages/client/src/scripts/emojilist.ts index 0c4dbe234b..b042c26662 100644 --- a/packages/client/src/scripts/emojilist.ts +++ b/packages/client/src/scripts/emojilist.ts @@ -1,5 +1,19 @@ +import data from "unicode-emoji-json/data-by-group.json"; +import emojiComponents from "unicode-emoji-json/data-emoji-components.json"; +import individualData from "unicode-emoji-json/data-by-emoji.json"; +import keywordSet from "emojilib"; +import { defaultStore } from "@/store"; + +export type UnicodeEmojiDef = { + emoji: string; + category: typeof unicodeEmojiCategories[number]; + skin_tone_support: boolean; + slug: string; + keywords?: string[]; +}; + export const unicodeEmojiCategories = [ - "face", + "emotion", "people", "animals_and_nature", "food_and_drink", @@ -10,14 +24,101 @@ export const unicodeEmojiCategories = [ "flags", ] as const; -export type UnicodeEmojiDef = { - name: string; - keywords: string[]; - char: string; - category: typeof unicodeEmojiCategories[number]; -}; +export const categoryMapping = { + "Smileys & Emotion": "emotion", + "People & Body": "people", + "Animals & Nature": "animals_and_nature", + "Food & Drink": "food_and_drink", + Activities: "activity", + "Travel & Places": "travel_and_places", + Objects: "objects", + Symbols: "symbols", + Flags: "flags", +} as const; -// initial converted from https://github.com/muan/emojilib/commit/242fe68be86ed6536843b83f7e32f376468b38fb -import _emojilist from "../emojilist.json"; +export function addSkinTone(emoji: string, skinTone?: number) { + const chosenSkinTone = skinTone || defaultStore.state.reactionPickerSkinTone; + const skinToneModifiers = [ + "", + emojiComponents.light_skin_tone, + emojiComponents.medium_light_skin_tone, + emojiComponents.medium_skin_tone, + emojiComponents.medium_dark_skin_tone, + emojiComponents.dark_skin_tone, + ]; + const strippedEmoji = emoji.replace( + new RegExp(`(${skinToneModifiers.slice(1).join("|")})`, "gi"), + "", + ); + if (individualData[strippedEmoji].skin_tone_support) { + return strippedEmoji + (skinToneModifiers[chosenSkinTone - 1] || ""); + } else { + return emoji; + } +} -export const emojilist = _emojilist as UnicodeEmojiDef[]; +const unicodeFifteenEmojis = [ + "🫨", + "🩷", + "🩵", + "🩶", + "🫷", + "🫸", + "🫎", + "🫏", + "🪽", + "🐦⬛", + "🪿", + "🪼", + "🪻", + "🫚", + "🫛", + "🪭", + "🪮", + "🪇", + "🪈", + "🪯", + "🛜", +]; + +const newData = {}; + +Object.keys(data).forEach((originalCategory) => { + const newCategory = categoryMapping[originalCategory]; + if (newCategory) { + newData[newCategory] = newData[newCategory] || []; + Object.keys(data[originalCategory]).forEach((emojiIndex) => { + const emojiObj = { ...data[originalCategory][emojiIndex] }; + if (unicodeFifteenEmojis.includes(emojiObj.emoji)) { + return; + } + emojiObj.category = newCategory; + emojiObj.keywords = keywordSet[emojiObj.emoji]; + newData[newCategory].push(emojiObj); + }); + } +}); + +export const emojilist: UnicodeEmojiDef[] = Object.keys(newData).reduce( + (acc, category) => { + const categoryItems = newData[category].map((item) => { + return { + emoji: item.emoji, + slug: item.slug, + category: item.category, + skin_tone_support: item.skin_tone_support || false, + keywords: item.keywords || [], + }; + }); + return acc.concat(categoryItems); + }, + [], +); + +export function getNicelyLabeledCategory(internalName) { + return ( + Object.keys(categoryMapping).find( + (key) => categoryMapping[key] === internalName, + ) || internalName + ); +} diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts index 2bffc52461..75565a1ac3 100644 --- a/packages/client/src/scripts/get-note-menu.ts +++ b/packages/client/src/scripts/get-note-menu.ts @@ -108,6 +108,11 @@ export function getNoteMenu(props: { os.success(); } + function copyOriginal(): void { + copyToClipboard(appearNote.url ?? appearNote.uri); + os.success(); + } + function togglePin(pin: boolean): void { os.apiWithDialog( pin ? "i/pin" : "i/unpin", @@ -263,40 +268,6 @@ export function getNoteMenu(props: { null, ] : []), - { - icon: "ph-clipboard-text ph-bold ph-lg", - text: i18n.ts.copyContent, - action: copyContent, - }, - { - icon: "ph-link-simple ph-bold ph-lg", - text: i18n.ts.copyLink, - action: copyLink, - }, - appearNote.url || appearNote.uri - ? { - icon: "ph-arrow-square-out ph-bold ph-lg", - text: i18n.ts.showOnRemote, - action: () => { - window.open(appearNote.url || appearNote.uri, "_blank"); - }, - } - : undefined, - shareAvailable() - ? { - icon: "ph-share-network ph-bold ph-lg", - text: i18n.ts.share, - action: share, - } - : undefined, - instance.translatorAvailable - ? { - icon: "ph-translate ph-bold ph-lg", - text: i18n.ts.translate, - action: translate, - } - : undefined, - null, statePromise.then((state) => state?.isFavorited ? { @@ -356,6 +327,53 @@ export function getNoteMenu(props: { action: () => togglePin(true), } : undefined, + instance.translatorAvailable + ? { + icon: "ph-translate ph-bold ph-lg", + text: i18n.ts.translate, + action: translate, + } + : undefined, + appearNote.url || appearNote.uri + ? { + icon: "ph-arrow-square-out ph-bold ph-lg", + text: i18n.ts.showOnRemote, + action: () => { + window.open(appearNote.url || appearNote.uri, "_blank"); + }, + } + : undefined, + { + type: "parent", + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + children: [ + { + icon: "ph-clipboard-text ph-bold ph-lg", + text: i18n.ts.copyContent, + action: copyContent, + }, + { + icon: "ph-link-simple ph-bold ph-lg", + text: i18n.ts.copyLink, + action: copyLink, + }, + appearNote.url || appearNote.uri + ? { + icon: "ph-link-simple ph-bold ph-lg", + text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, + action: copyOriginal, + } + : undefined, + shareAvailable() + ? { + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + action: share, + } + : undefined, + ], + }, /* ...($i.isModerator || $i.isAdmin ? [ null, @@ -388,9 +406,9 @@ export function getNoteMenu(props: { "closed", ); }, - } + } : undefined, - instance.features.postEditing && isAppearAuthor + isAppearAuthor ? { icon: "ph-pencil-line ph-bold ph-lg", text: i18n.ts.edit, @@ -416,14 +434,24 @@ export function getNoteMenu(props: { !isAppearAuthor ? null : undefined, !isAppearAuthor ? { - type: "parent", - icon: "ph-user ph-bold ph-lg", - text: i18n.ts.user, - children: getUserMenu(appearNote.user) - } : undefined, + type: "parent", + icon: "ph-user ph-bold ph-lg", + text: i18n.ts.user, + children: getUserMenu(appearNote.user), + } + : undefined, ].filter((x) => x !== undefined); } else { menu = [ + appearNote.url || appearNote.uri + ? { + icon: "ph-arrow-square-out ph-bold ph-lg", + text: i18n.ts.showOnRemote, + action: () => { + window.open(appearNote.url || appearNote.uri, "_blank"); + }, + } + : undefined, { icon: "ph-clipboard-text ph-bold ph-lg", text: i18n.ts.copyContent, @@ -436,11 +464,16 @@ export function getNoteMenu(props: { }, appearNote.url || appearNote.uri ? { - icon: "ph-arrow-square-out ph-bold ph-lg", - text: i18n.ts.showOnRemote, - action: () => { - window.open(appearNote.url || appearNote.uri, "_blank"); - }, + icon: "ph-link-simple ph-bold ph-lg", + text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, + action: copyOriginal, + } + : undefined, + shareAvailable() + ? { + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + action: share, } : undefined, ].filter((x) => x !== undefined); diff --git a/packages/client/src/scripts/get-user-menu.ts b/packages/client/src/scripts/get-user-menu.ts index 39e1912b73..48b97fed62 100644 --- a/packages/client/src/scripts/get-user-menu.ts +++ b/packages/client/src/scripts/get-user-menu.ts @@ -227,7 +227,9 @@ export function getUserMenu(user, router: Router = mainRouter) { let menu = [ { type: "label", - text: user.host ? `@${user.username}@${user.host || host}` : `@${user.username}` + text: user.host + ? `@${user.username}@${user.host || host}` + : `@${user.username}`, }, { icon: "ph-at ph-bold ph-lg", diff --git a/packages/client/src/scripts/intl-const.ts b/packages/client/src/scripts/intl-const.ts new file mode 100644 index 0000000000..ac73723717 --- /dev/null +++ b/packages/client/src/scripts/intl-const.ts @@ -0,0 +1,12 @@ +import { lang } from "@/config"; + +export const versatileLang = (lang ?? "ja-JP").replace("ja-KS", "ja-JP"); +export const dateTimeFormat = new Intl.DateTimeFormat(versatileLang, { + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", +}); +export const numberFormat = new Intl.NumberFormat(versatileLang); diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index c8ce96b0ee..25ed553070 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -242,6 +242,10 @@ export const defaultStore = markRaw( where: "device", default: "remote" as "none" | "remote" | "always", }, + reactionPickerSkinTone: { + where: "account", + default: 1, + }, reactionPickerSize: { where: "device", default: 3, @@ -310,6 +314,10 @@ export const defaultStore = markRaw( where: "device", default: false, }, + swipeOnMobile: { + where: "device", + default: true, + }, showAdminUpdates: { where: "account", default: true, @@ -332,8 +340,8 @@ export const defaultStore = markRaw( }, showTimelineReplies: { where: "device", - default: true, - } + default: false, + }, }), ); diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 0f3f841b94..41dd19cf7a 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -13,22 +13,14 @@ } // https://larsenwork.com/easing-gradients/ - --gradient: hsl(0, 0%, 0%) 0%, - hsla(0, 0%, 0%, 0.987) 8.1%, - hsla(0, 0%, 0%, 0.951) 15.5%, - hsla(0, 0%, 0%, 0.896) 22.5%, - hsla(0, 0%, 0%, 0.825) 29%, - hsla(0, 0%, 0%, 0.741) 35.3%, - hsla(0, 0%, 0%, 0.648) 41.2%, - hsla(0, 0%, 0%, 0.55) 47.1%, - hsla(0, 0%, 0%, 0.45) 52.9%, - hsla(0, 0%, 0%, 0.352) 58.8%, - hsla(0, 0%, 0%, 0.259) 64.7%, - hsla(0, 0%, 0%, 0.175) 71%, - hsla(0, 0%, 0%, 0.104) 77.5%, - hsla(0, 0%, 0%, 0.049) 84.5%, - hsla(0, 0%, 0%, 0.013) 91.9%, - hsla(0, 0%, 0%, 0) 100%; + --gradient: hsl(0, 0%, 0%) 0%, hsla(0, 0%, 0%, 0.987) 8.1%, + hsla(0, 0%, 0%, 0.951) 15.5%, hsla(0, 0%, 0%, 0.896) 22.5%, + hsla(0, 0%, 0%, 0.825) 29%, hsla(0, 0%, 0%, 0.741) 35.3%, + hsla(0, 0%, 0%, 0.648) 41.2%, hsla(0, 0%, 0%, 0.55) 47.1%, + hsla(0, 0%, 0%, 0.45) 52.9%, hsla(0, 0%, 0%, 0.352) 58.8%, + hsla(0, 0%, 0%, 0.259) 64.7%, hsla(0, 0%, 0%, 0.175) 71%, + hsla(0, 0%, 0%, 0.104) 77.5%, hsla(0, 0%, 0%, 0.049) 84.5%, + hsla(0, 0%, 0%, 0.013) 91.9%, hsla(0, 0%, 0%, 0) 100%; //--ad: rgb(255 169 0 / 10%); } @@ -53,9 +45,12 @@ html { text-size-adjust: 100%; tab-size: 2; scroll-padding: 60px; + overflow-x: clip; &.useSystemFont { - font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", + Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", + sans-serif; } } body::-webkit-scrollbar { @@ -97,16 +92,36 @@ body::-webkit-scrollbar-thumb { } html._themeChanging_ { - &, *, ::before, ::after { + &, + *, + ::before, + ::after { transition: background 1s ease, border 1s ease !important; } } -html, body { +html, +body { margin: 0; padding: 0; } +.swiper { + margin-inline: -24px !important; + padding-inline: 24px !important; + mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 24px), + transparent + ); + -webkit-mask: linear-gradient( + to right, + transparent, + black 24px calc(100% - 24px), + transparent + ); +} .swiper-slide { min-height: 100vh; } @@ -122,11 +137,13 @@ a { // transform: translateY(0.1em); // } -textarea, input { +textarea, +input { -webkit-tap-highlight-color: transparent; } -optgroup, option { +optgroup, +option { background: var(--panel); color: var(--fg); } @@ -143,8 +160,12 @@ hr { } @keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } } ._noSelect { @@ -154,7 +175,8 @@ hr { } ._ghost { - &, * { + &, + * { @extend ._noSelect; pointer-events: none; } @@ -194,7 +216,8 @@ hr { font-family: inherit; line-height: inherit; - &, * { + &, + * { @extend ._noSelect; } @@ -234,7 +257,9 @@ hr { transition: background 0.2s; } - &:hover:before, &:focus::before, &.highlighted::before { + &:hover:before, + &:focus::before, + &.highlighted::before { background: var(--buttonBg); } &:focus-visible::before { @@ -262,7 +287,11 @@ hr { ._buttonGradate { @extend ._buttonPrimary; color: var(--fgOnAccent); - background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); + background: linear-gradient( + 90deg, + var(--buttonGradateA), + var(--buttonGradateB) + ); &:not(:disabled):hover { background: linear-gradient(90deg, var(--X8), var(--X8)); @@ -275,7 +304,7 @@ hr { ._help { color: var(--accent); - cursor: help + cursor: help; } ._textButton { @@ -348,7 +377,9 @@ hr { } ._block { - @extend ._panel; + background: var(--panel); + border-radius: var(--radius); + overflow: visible; & + ._block { margin-top: var(--margin); @@ -477,7 +508,7 @@ hr { bottom: 0; z-index: -1; background: var(--bg); - opacity: .75; + opacity: 0.75; } } } @@ -508,7 +539,7 @@ hr { ._flexList { display: flex; flex-wrap: wrap; - gap: .2em; + gap: 0.2em; width: min-content; min-width: 100%; &._center { @@ -585,7 +616,7 @@ hr { color: var(--link); &:after { - content: ''; + content: ""; position: absolute; bottom: 0; left: 0; @@ -625,24 +656,51 @@ hr { outline: none; } +:not(.noGap):not(._block) > { + .note-container, + .cmuxhskf > section, + ._gap > ._block, + ._panel, + .noGap, + .profile, + .card { + &:not(.caution) { + box-shadow: 0 4px 25px rgba(0, 0, 0, 0.04); + border-radius: var(--radius); + overflow: clip; + } + } +} +.widgets ._panel { + box-shadow: none !important; +} + ._zoom { transition-duration: 0.5s, 0.5s; transition-property: opacity, transform; - transition-timing-function: cubic-bezier(0,.5,.5,1); + transition-timing-function: cubic-bezier(0, 0.5, 0.5, 1); } -.zoom-enter-active, .zoom-leave-active { +.zoom-enter-active, +.zoom-leave-active { transition: opacity 0.5s, transform 0.5s !important; } -.zoom-enter-from, .zoom-leave-to { +.zoom-enter-from, +.zoom-leave-to { opacity: 0; transform: scale(0.9); } @keyframes blink { - 0% { opacity: 1; } - 70% { opacity: 0; } - 100% { opacity: 1; } + 0% { + opacity: 1; + } + 70% { + opacity: 0; + } + 100% { + opacity: 1; + } } @keyframes tada { @@ -673,7 +731,7 @@ hr { } } -@media(prefers-reduced-motion) { +@media (prefers-reduced-motion) { @keyframes tada { from { transform: scale3d(1, 1, 1); @@ -687,105 +745,114 @@ hr { transform: scale3d(1, 1, 1); } } + + @keyframes blink { + 0% { + opacity: 1; + } + 100% { + opacity: 1; + } + } } ._anime_bounce { will-change: transform; - animation: bounce ease 0.7s; - animation-iteration-count: 1; - transform-origin: 50% 50%; + animation: bounce ease 0.7s; + animation-iteration-count: 1; + transform-origin: 50% 50%; } ._anime_bounce_ready { will-change: transform; - transform: scaleX(0.90) scaleY(0.90) ; + transform: scaleX(0.9) scaleY(0.9); } ._anime_bounce_standBy { transition: transform 0.1s ease; } -@keyframes bounce{ - 0% { - transform: scaleX(0.90) scaleY(0.90) ; - } - 19% { - transform: scaleX(1.10) scaleY(1.10) ; - } - 48% { - transform: scaleX(0.95) scaleY(0.95) ; - } - 100% { - transform: scaleX(1.00) scaleY(1.00) ; - } +@keyframes bounce { + 0% { + transform: scaleX(0.9) scaleY(0.9); + } + 19% { + transform: scaleX(1.1) scaleY(1.1); + } + 48% { + transform: scaleX(0.95) scaleY(0.95); + } + 100% { + transform: scaleX(1) scaleY(1); + } } .ph-xxs { - font-size: 0.5em; + font-size: 0.5em; } .ph-xs { - font-size: 0.75em; + font-size: 0.75em; } .ph-sm { - font-size: 0.875em; + font-size: 0.875em; } .ph-lg { - font-size: 1.3333em; - line-height: 0.75em; - vertical-align: -0.0667em; + font-size: 1.3333em; + line-height: 0.75em; + vertical-align: -0.0667em; justify-content: center; } .ph-xl { - font-size: 1.5em; - line-height: 0.6666em; - vertical-align: -0.075em; + font-size: 1.5em; + line-height: 0.6666em; + vertical-align: -0.075em; } .ph-1x { - font-size: 1em; + font-size: 1em; } .ph-2x { - font-size: 2em; + font-size: 2em; } .ph-3x { - font-size: 3em; + font-size: 3em; } .ph-4x { - font-size: 4em; + font-size: 4em; } .ph-5x { - font-size: 5em; + font-size: 5em; } .ph-6x { - font-size: 6em; + font-size: 6em; } .ph-7x { - font-size: 7em; + font-size: 7em; } .ph-8x { - font-size: 8em; + font-size: 8em; } .ph-9x { - font-size: 9em; + font-size: 9em; } .ph-10x { - font-size: 10em; + font-size: 10em; } .ph-fw { - text-align: center; - width: 1.25em; + text-align: center; + width: 1.25em; display: inline-flex; } @@ -798,7 +865,38 @@ hr { } } -@media(prefers-reduced-motion: no-preference) { +// ._otp_input { +// width: 30px; +// height: 30px; +// padding: 5px; +// margin: 1rem 7px auto; +// font-size: 20px; +// border-radius: 4px; +// border: 2px solid var(--accent); +// background-color: var(--accentedBg); +// color: var(--fg); +// text-align: center; +// } +// ._otp_input.error { +// border-color: var(--error) !important; +// } +// ._otp_input::-webkit-inner-spin-button, +// ._otp_input::-webkit-outer-spin-button { +// -webkit-appearance: none; +// margin: 0; +// } + +@keyframes reset { + to { + transform: none; + opacity: 1; + } +} +.instant { + animation-duration: 0s !important; +} + +@media (prefers-reduced-motion: no-preference) { @keyframes scaleIn { from { transform: scale(0); @@ -807,7 +905,7 @@ hr { } @keyframes scaleInSmall { from { - transform: scale(.8); + transform: scale(0.8); opacity: 0; } } diff --git a/packages/client/src/ui/_common_/navbar-for-mobile.vue b/packages/client/src/ui/_common_/navbar-for-mobile.vue index 39abb7c261..03a8e6d8a7 100644 --- a/packages/client/src/ui/_common_/navbar-for-mobile.vue +++ b/packages/client/src/ui/_common_/navbar-for-mobile.vue @@ -62,6 +62,9 @@ <span v-if="navbarItemDef[item].indicated" class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="icon ph-circle ph-fill"></i ></span> </component> @@ -82,7 +85,10 @@ class="icon ph-dots-three-outline ph-bold ph-lg ph-fw ph-lg" ></i ><span class="text">{{ i18n.ts.more }}</span> - <span v-if="otherMenuItemIndicated" class="indicator" + <span + v-if="otherMenuItemIndicated" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="icon ph-circle ph-fill"></i ></span> </button> @@ -341,6 +347,9 @@ function more() { left: 20px; color: var(--navIndicator); font-size: 8px; + } + + > .animateIndicator { animation: blink 1s infinite; } diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue index 7905c331c7..f63be18cbe 100644 --- a/packages/client/src/ui/_common_/navbar.vue +++ b/packages/client/src/ui/_common_/navbar.vue @@ -66,6 +66,9 @@ <span v-if="navbarItemDef[item].indicated" class="indicator" + :class="{ + animateIndicator: $store.state.animation, + }" ><i class="icon ph-circle ph-fill"></i ></span> </component> @@ -88,6 +91,7 @@ updateAvailable " class="indicator" + :class="{ animateIndicator: $store.state.animation }" ></span ><i class="icon ph-door ph-bold ph-fw ph-lg"></i ><span class="text">{{ i18n.ts.controlPanel }}</span> @@ -102,7 +106,10 @@ class="icon ph-dots-three-outline ph-bold ph-fw ph-lg" ></i ><span class="text">{{ i18n.ts.more }}</span> - <span v-if="otherMenuItemIndicated" class="indicator" + <span + v-if="otherMenuItemIndicated" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="icon ph-circle ph-fill"></i ></span> </button> @@ -419,6 +426,9 @@ function more(ev: MouseEvent) { left: 20px; color: var(--navIndicator); font-size: 8px; + } + + > .animateIndicator { animation: blink 1s infinite; } @@ -602,6 +612,9 @@ function more(ev: MouseEvent) { left: 24px; color: var(--navIndicator); font-size: 8px; + } + + > .animateIndicator { animation: blink 1s infinite; } diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index 6da6ad506d..944ee17e5c 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -9,6 +9,7 @@ class="columns" :class="deckStore.reactiveState.columnAlign.value" @contextmenu.self.prevent="onContextmenu" + @wheel.self="onWheel" > <template v-for="ids in layout"> <!-- sectionを利用しているのは、deck.vue側でcolumnに対してfirst-of-typeを効かせるため --> @@ -31,6 +32,7 @@ ) + 'px', } " + @wheel.self="onWheel" > <DeckColumnCore v-for="id in ids" @@ -50,6 +52,7 @@ :is-stacked="false" :style="columns.find(c => c.id === ids[0])!.flexible ? { flex: 1, minWidth: '350px' } : { width: columns.find(c => c.id === ids[0])!.width + 'px' }" @parent-focus="moveFocus(ids[0], $event)" + @headerWheel="onWheel" /> </template> <div v-if="layout.length === 0" class="intro _panel"> @@ -116,7 +119,10 @@ @click="drawerMenuShowing = true" > <i class="ph-list ph-bold ph-lg"></i - ><span v-if="menuIndicated" class="indicator" + ><span + v-if="menuIndicated" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -133,7 +139,10 @@ @click="mainRouter.push('/my/notifications')" > <i class="ph-bell ph-bold ph-lg"></i - ><span v-if="$i?.hasUnreadNotification" class="indicator" + ><span + v-if="$i?.hasUnreadNotification" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </button> @@ -279,18 +288,15 @@ const onContextmenu = (ev) => { ); }; -document.documentElement.style.overflowY = "hidden"; -document.documentElement.style.scrollBehavior = "auto"; -window.addEventListener("wheel", (ev) => { - if (ev.target === columnsEl && ev.deltaX === 0) { - columnsEl.scrollLeft += ev.deltaY; - } else if ( - getScrollContainer(ev.target as HTMLElement) == null && - ev.deltaX === 0 - ) { +function onWheel(ev: WheelEvent) { + if (ev.deltaX === 0) { columnsEl.scrollLeft += ev.deltaY; } -}); +} + +document.documentElement.style.overflowY = "hidden"; +document.documentElement.style.scrollBehavior = "auto"; + loadDeck(); function moveFocus(id: string, direction: "up" | "down" | "left" | "right") { @@ -551,6 +557,9 @@ async function deleteProfile() { left: 0; color: var(--indicator); font-size: 16px; + } + + > .animateIndicator { animation: blink 1s infinite; } diff --git a/packages/client/src/ui/deck/column.vue b/packages/client/src/ui/deck/column.vue index 03859abc0a..dcf94b31a7 100644 --- a/packages/client/src/ui/deck/column.vue +++ b/packages/client/src/ui/deck/column.vue @@ -23,6 +23,7 @@ @dragstart="onDragstart" @dragend="onDragend" @contextmenu.prevent.stop="onContextmenu" + @wheel="emit('headerWheel', $event)" > <button v-if="isStacked && !isMainColumn" @@ -95,6 +96,7 @@ const props = withDefaults( const emit = defineEmits<{ (ev: "parent-focus", direction: "up" | "down" | "left" | "right"): void; (ev: "change-active-state", v: boolean): void; + (ev: "headerWheel", ctx: WheelEvent): void; }>(); let body = $ref<HTMLDivElement>(); diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue index 01141fc61b..e7a1f97f37 100644 --- a/packages/client/src/ui/universal.vue +++ b/packages/client/src/ui/universal.vue @@ -39,7 +39,10 @@ > <div class="button-wrapper"> <i class="ph-list ph-bold ph-lg"></i - ><span v-if="menuIndicated" class="indicator" + ><span + v-if="menuIndicated" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </div> @@ -74,7 +77,10 @@ :class="buttonAnimIndex === 1 ? 'on' : ''" > <i class="ph-bell ph-bold ph-lg"></i - ><span v-if="$i?.hasUnreadNotification" class="indicator" + ><span + v-if="$i?.hasUnreadNotification" + class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </div> @@ -95,6 +101,7 @@ ><span v-if="$i?.hasUnreadMessagingMessage" class="indicator" + :class="{ animateIndicator: $store.state.animation }" ><i class="ph-circle ph-fill"></i ></span> </div> @@ -471,6 +478,21 @@ console.log(mainRouter.currentRoute.value.name); } &.wallpaper { background: var(--wallpaperOverlay); + + :deep(.sidebar .middle) { + position: relative; + &::before { + content: ""; + position: absolute; + inset: -10px 10px; + background: var(--bg); + border-radius: calc((2.85rem / 2) + 5px); + opacity: 1; + } + > ._button:last-child { + margin-bottom: 0 !important; + } + } } &.centered { @@ -547,7 +569,7 @@ console.log(mainRouter.currentRoute.value.name); &.wallpaper { .contents { background: var(--acrylicBg) !important; - backdrop-filter: blur(12px); + backdrop-filter: var(--blur, blur(12px)); } :deep(.tl), :deep(.notes) { @@ -560,6 +582,7 @@ console.log(mainRouter.currentRoute.value.name); width: 100%; min-width: 0; $widgets-hide-threshold: 1090px; + overflow-x: clip; @media (max-width: $widgets-hide-threshold) { padding-bottom: calc(env(safe-area-inset-bottom, 0px) + 96px); } @@ -676,6 +699,9 @@ console.log(mainRouter.currentRoute.value.name); left: 0; color: var(--indicator); font-size: 16px; + } + + > .animateIndicator { animation: blink 1s infinite; } } @@ -697,6 +723,9 @@ console.log(mainRouter.currentRoute.value.name); left: 0; color: var(--indicator); font-size: 16px; + } + + > .animateIndicator { animation: blink 1s infinite; } diff --git a/packages/client/src/ui/universal.widgets.vue b/packages/client/src/ui/universal.widgets.vue index d931e1bf3f..4a7a0d9e2e 100644 --- a/packages/client/src/ui/universal.widgets.vue +++ b/packages/client/src/ui/universal.widgets.vue @@ -88,9 +88,11 @@ function updateWidgets(widgets) { min-height: 100vh; padding: var(--margin) 0; box-sizing: border-box; + display: flex; + flex-direction: column; - > * { - margin: var(--margin) 0; + > :deep(*) { + margin-top: var(--margin); width: 300px; &:first-child { @@ -98,6 +100,10 @@ function updateWidgets(widgets) { } } + .a:empty { + display: none; + } + > .add { margin: 0 auto; } diff --git a/packages/client/src/widgets/calendar.vue b/packages/client/src/widgets/calendar.vue index 655308d504..aab03be9e9 100644 --- a/packages/client/src/widgets/calendar.vue +++ b/packages/client/src/widgets/calendar.vue @@ -5,7 +5,7 @@ <span class="year">{{ i18n.t("yearX", { year }) }}</span> <span class="month">{{ i18n.t("monthX", { month }) }}</span> </p> - <p v-if="month === 1 && day === 1" class="day"> + <p v-if="(month === 1 && day === 1) || isBirthday" class="day"> 🎉{{ i18n.t("dayX", { day }) }}<span style="display: inline-block; transform: scaleX(-1)" >🎉</span @@ -55,6 +55,7 @@ import { import { GetFormResultType } from "@/scripts/form"; import { i18n } from "@/i18n"; import { useInterval } from "@/scripts/use-interval"; +import { $i } from "@/account"; const name = "calendar"; @@ -80,6 +81,8 @@ const { widgetProps, configure } = useWidgetPropsManager( emit ); +const hasBirthday = Boolean($i?.birthday); + const year = ref(0); const month = ref(0); const day = ref(0); @@ -88,6 +91,8 @@ const yearP = ref(0); const monthP = ref(0); const dayP = ref(0); const isHoliday = ref(false); +const isBirthday = ref(false); + const tick = () => { const now = new Date(); const nd = now.getDate(); @@ -121,6 +126,13 @@ const tick = () => { yearP.value = (yearNumer / yearDenom) * 100; isHoliday.value = now.getDay() === 0 || now.getDay() === 6; + + if (hasBirthday) { + const [bdayYear, bdayMonth, bdayDay] = $i.birthday.split("-"); + if (month.value === +bdayMonth && day.value == +bdayDay) { + isBirthday.value = true; + } + } }; useInterval(tick, 1000, { diff --git a/packages/client/src/widgets/notifications.vue b/packages/client/src/widgets/notifications.vue index 48fb9278a9..82fb961686 100644 --- a/packages/client/src/widgets/notifications.vue +++ b/packages/client/src/widgets/notifications.vue @@ -12,10 +12,15 @@ <template #func ><button class="_button" + :aria-label="i18n.ts.markAllAsRead" @click="os.apiWithDialog('notifications/mark-all-as-read')" > <i class="ph-check ph-bold ph-lg"></i></button - ><button class="_button" @click="configureNotification()"> + ><button + class="_button" + :aria-label="i18n.ts.notificationSetting" + @click="configureNotification()" + > <i class="ph-gear-six ph-bold ph-lg"></i></button ></template> <div> diff --git a/packages/client/src/widgets/rss.vue b/packages/client/src/widgets/rss.vue index 370ec2023b..d28f1bf323 100644 --- a/packages/client/src/widgets/rss.vue +++ b/packages/client/src/widgets/rss.vue @@ -1,5 +1,10 @@ <template> - <MkContainer :show-header="widgetProps.showHeader" class="mkw-rss"> + <MkContainer + :show-header="widgetProps.showHeader" + class="mkw-rss" + :scrollable="true" + :style="`height: ${widgetProps.height}px;`" + > <template #header><i class="ph-rss ph-bold ph-lg"></i>RSS</template> <template #func ><button class="_button" @click="configure"> @@ -44,6 +49,10 @@ const widgetPropsDef = { type: "string" as const, default: "http://feeds.afpbb.com/rss/afpbb/afpbbnews", }, + height: { + type: "number" as const, + default: 300, + }, showHeader: { type: "boolean" as const, default: true, diff --git a/packages/client/src/widgets/server-metric/index.vue b/packages/client/src/widgets/server-metric/index.vue index cf84212b1e..49dc59ea27 100644 --- a/packages/client/src/widgets/server-metric/index.vue +++ b/packages/client/src/widgets/server-metric/index.vue @@ -106,7 +106,7 @@ const { widgetProps, configure, save } = useWidgetPropsManager( const meta = ref(null); -os.api("server-info", {}).then((res) => { +os.apiGet("server-info", {}).then((res) => { meta.value = res; }); diff --git a/patrons.json b/patrons.json index cda7551d8c..58cbb45306 100644 --- a/patrons.json +++ b/patrons.json @@ -10,17 +10,15 @@ "@griff@stop.voring.me", "@cafkafk@ck.cafkafk.com", "@privateger@plasmatrap.com", - "@self@neo.voidworks.cc", - "@effy@social.effy.space", + "@effye@toot.thoughtworks.com", "@Kio@kitsunes.club", "@twann@tech.lgbt", "@surfbum@calckey.nz", "@topher@mastodon.online", "@hanicef@stop.voring.me", "@nmkj@calckey.jp", - "@trapezial@calckey.jp", "@unattributed@calckey.social", - "@cody@mk.codingneko.com", + "@cody@misskey.codingneko.com", "@kate@blahaj.zone", "@emtk@mkkey.net", "@jovikowi@calckey.social", @@ -35,13 +33,12 @@ "@box464@calckey.social", "@MariaTheMartian@calckey.social", "@nisemikol@calckey.social", - "@smallpatatas@calckey.patatas.ca", + "@smallpatatas@blahaj.zone", "@bayra@stop.voring.me", "@frost@wolfdo.gg", "@joebiden@fuckgov.org", "@nyaa@calckey.social", "@Dan@calckey.social", - "@testing@stop.voring.me", "@dana@calckey.social", "@Jdreben@calckey.social", "@natalie@prismst.one", @@ -56,6 +53,33 @@ "@riversidebryan@calckey.lgbt", "@aRubes@sloth.run", "@andreasdotorg@calckey.social", + "@ozzy@calckey.online", + "@leni@windycity.style", + "@mhzmodels@calckey.art", + "@ReflexVE@calckey.social", + "@mark@calckey.social", + "@skyizwhite@himagine.club", + "@Uwu@calckey.social", + "@jGoose@calckey.social", + "@kunev@blewsky.social", + "@Simoto@electricrequiem.com", + "@Evoterra@calckey.social", + "@LauraLangdon@procial.tchncs.de", + "@mho@social.heise.de", + "@richardazia@calckey.social", + "@blues653@calckey.social", + "@rafale_blue@calc.04.si", + "@esm@lethallava.land", + "@vmstan@vmst.io", + "@jtbennett@noc.social", + "@renere@distance.blue", + "@theking@kitsunes.club", + "@toof@fedi.toofie.net", + "@Punko@calckey.social", + "@joesbrat67@calckey.social", + "@arth@calckey.social", + "@octofloofy@ck.octofloofy.ink", + "@pauliehedron@infosec.town", "\nInterkosmos Link" ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ecab716a2..560bb55a37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,6 +36,9 @@ importers: '@types/gulp-rename': specifier: 2.0.1 version: 2.0.1 + chalk: + specifier: 4.1.2 + version: 4.1.2 cross-env: specifier: 7.0.3 version: 7.0.3 @@ -102,6 +105,9 @@ importers: '@koa/router': specifier: 9.0.1 version: 9.0.1 + '@msgpack/msgpack': + specifier: 3.0.0-beta2 + version: 3.0.0-beta2 '@peertube/http-signature': specifier: 1.7.0 version: 1.7.0 @@ -129,9 +135,6 @@ importers: argon2: specifier: ^0.30.3 version: 0.30.3 - async-mutex: - specifier: ^0.4.0 - version: 0.4.0 autobind-decorator: specifier: 2.4.0 version: 2.4.0 @@ -336,6 +339,9 @@ importers: redis-lock: specifier: 0.1.4 version: 0.1.4 + redis-semaphore: + specifier: 5.3.1 + version: 5.3.1(ioredis@5.3.2) reflect-metadata: specifier: 0.1.13 version: 0.1.13 @@ -611,9 +617,6 @@ importers: packages/calckey-js: dependencies: - autobind-decorator: - specifier: ^2.4.0 - version: 2.4.0 eventemitter3: specifier: ^4.0.7 version: 4.0.7 @@ -623,25 +626,29 @@ importers: semver: specifier: ^7.3.8 version: 7.5.1 + optionalDependencies: + '@swc/core-android-arm64': + specifier: 1.3.11 + version: 1.3.11 devDependencies: + '@microsoft/api-documenter': + specifier: ^7.22.21 + version: 7.22.21(@types/node@20.3.1) '@microsoft/api-extractor': - specifier: ^7.19.3 - version: 7.19.3 + specifier: ^7.36.0 + version: 7.36.0(@types/node@20.3.1) + '@swc/cli': + specifier: ^0.1.62 + version: 0.1.62(@swc/core@1.3.62)(chokidar@3.3.1) + '@swc/core': + specifier: ^1.3.62 + version: 1.3.62 '@types/jest': specifier: ^27.4.0 version: 27.4.0 '@types/node': - specifier: 17.0.5 - version: 17.0.5 - '@typescript-eslint/eslint-plugin': - specifier: 5.8.1 - version: 5.8.1(@typescript-eslint/parser@5.8.1)(eslint@8.6.0)(typescript@4.5.4) - '@typescript-eslint/parser': - specifier: 5.8.1 - version: 5.8.1(eslint@8.6.0)(typescript@4.5.4) - eslint: - specifier: 8.6.0 - version: 8.6.0 + specifier: 20.3.1 + version: 20.3.1 jest: specifier: ^27.4.5 version: 27.4.5(ts-node@10.4.0) @@ -656,16 +663,16 @@ importers: version: 9.0.8 ts-jest: specifier: ^27.1.2 - version: 27.1.2(@babel/core@7.22.5)(@types/jest@27.4.0)(jest@27.4.5)(typescript@4.5.4) + version: 27.1.2(@babel/core@7.22.5)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3) ts-node: specifier: 10.4.0 - version: 10.4.0(@types/node@17.0.5)(typescript@4.5.4) + version: 10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3) tsd: - specifier: ^0.19.1 - version: 0.19.1 + specifier: ^0.28.1 + version: 0.28.1 typescript: - specifier: 4.5.4 - version: 4.5.4 + specifier: 5.1.3 + version: 5.1.3 packages/client: devDependencies: @@ -777,6 +784,9 @@ importers: date-fns: specifier: 2.30.0 version: 2.30.0 + emojilib: + specifier: github:thatonecalculator/emojilib + version: github.com/thatonecalculator/emojilib/06944984a61ee799b7083894258f5fa318d932d1 escape-regexp: specifier: 0.0.1 version: 0.0.1 @@ -882,6 +892,9 @@ importers: typescript: specifier: 5.1.3 version: 5.1.3 + unicode-emoji-json: + specifier: ^0.4.0 + version: 0.4.0 uuid: specifier: 9.0.0 version: 9.0.0 @@ -939,6 +952,10 @@ importers: packages: + /@aashutoshrathi/word-wrap@1.2.5: + resolution: {integrity: sha512-plhoNEfSVdHMKXQyAxvH0Zyv3/4NL8r6pwgMQdmHR2vBUXn2t74PN2pBRppqKUa6RMT0yldyvOHG5Dbjwy2mBQ==} + engines: {node: '>=0.10.0'} + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -996,7 +1013,7 @@ packages: '@babel/compat-data': 7.22.5 '@babel/core': 7.22.5 '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.8 + browserslist: 4.21.9 lru-cache: 5.1.1 semver: 6.3.0 @@ -1408,92 +1425,92 @@ packages: dev: true optional: true - /@cropper/element-canvas@2.0.0-beta.2: - resolution: {integrity: sha512-LZcnMwv7M3ZxUKX9YrYGxqbf8YsYfeIUFREaB/IkKsm7E7ASaDrrjdc996QYMjdjUNcWdJjxhsoucPNEvl/DXA==} + /@cropper/element-canvas@2.0.0-beta.3: + resolution: {integrity: sha512-G4KqpZHAqb2PNY63lt7MxSIXQhYrQUWImDmsQYrXSTVYC5yrMLlk5bT9oEaSTjQZnV4x5EaujFM+gx6lWh/5sg==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-crosshair@2.0.0-beta.2: - resolution: {integrity: sha512-kBxZ2zZ7uR7XlQcnUbudq7562XwtTOqbGNYg5VWem/ukcAAKwYmPlapNlv7n228DSUGEz5FxKW8GSwLucJlQ0Q==} + /@cropper/element-crosshair@2.0.0-beta.3: + resolution: {integrity: sha512-SfrzZjO+x7ND/CgAclfwDQ9T/nTlZTKsLtM+dDXfjJQjuqreMaWaLD23isB1kh8H7iqjz1g+VE2ZsdiLB932ww==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-grid@2.0.0-beta.2: - resolution: {integrity: sha512-rWMOjlj+eq9L2oxAthNYdGxbV3sYyV+tra6VAuooZl+RbdQZ9XCnG0Pitb/RfgPZb860ia0q8biE5zEq4Uc8fA==} + /@cropper/element-grid@2.0.0-beta.3: + resolution: {integrity: sha512-/U1/sNcJ9TKcUD7N+yHJqxRfZcW15XHz63LYMLaWQ7Cnnq2uYopopJUqtTiAdIoCh6mwoIWdYvLZ1Vhr6XKJBg==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-handle@2.0.0-beta.2: - resolution: {integrity: sha512-IAFyqldnB57ZGzvf3VuE7Y9UAaq9IMmun15v17cAWX1q4ZCVqdFrugAWpRF+V5WgHBL2doxHUOQlfy7LznzRmg==} + /@cropper/element-handle@2.0.0-beta.3: + resolution: {integrity: sha512-bjxZfX0rqj4RsTBGxJ1WcxDya1/25dKe9j4+YRZFyASQUOPuUrqVOpWKQcGaQ0PeN+wfwLo3422vjaGSXNA+Pg==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-image@2.0.0-beta.2: - resolution: {integrity: sha512-FgYb+GfcxdewH6VKgw6Ltws8fw3TSP8d0HMH/WZubBC2w/NNAvp92EonwgjDoTLEFFJKbj5P2aKTFY0aO70R0Q==} + /@cropper/element-image@2.0.0-beta.3: + resolution: {integrity: sha512-1VjqaJG+IxPDkvEUvnKAfR12zK8fx+C6+ZsC5T4986KLtpltmqccaYiupgGXX8CVHrVyaW5ncBvOXSTGowiC7Q==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-selection@2.0.0-beta.2: - resolution: {integrity: sha512-O/fxpJe/WB5H+mELSVfp4tOAAa7yMVa+wn35DCRxaDPb/1Um55E7OT1G3puAL9Elm7NFA/CCMYuHohl9emE25A==} + /@cropper/element-selection@2.0.0-beta.3: + resolution: {integrity: sha512-FjcNwUaV5/KzQROoaoNZzOpeRe92PCd8PPTgfl4/b2rGgpYvGcjwpjei5HRsF+uaDJwR2f1MOK8L+3ZkAUw18Q==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/element-image': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-shade@2.0.0-beta.2: - resolution: {integrity: sha512-aY5RP2ygteq51ZDU3+rAj+f+0hSgEf+vRAdJ1YO2bJ1n25TpOaz2klO5COdHxn3unLVjYK97khIZGs7ClbV0rQ==} + /@cropper/element-shade@2.0.0-beta.3: + resolution: {integrity: sha512-WCmGYbmewIF49GUeJyXCXZUBwmLsu7B+G22o5FObhtxoY8pF7mp1SclIZdJU5KfvGFFOzXKHJg4yx1wO9IAfvQ==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/element-selection': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element-viewer@2.0.0-beta.2: - resolution: {integrity: sha512-/2BhLFr2Ti5LnRvcIlLlR3NDSF3x9w9BvYukFbnCxoTLIbGvwM02YQV2Qx+al8C0mBoW0ab6uF5ykl6W8i9WkQ==} + /@cropper/element-viewer@2.0.0-beta.3: + resolution: {integrity: sha512-A2yh8ULbxuykJHVvcG3eI81VX2ug/IklDuOAzCP4yRMGSvGb9eK0BQDkOButoViwM2FtleCf2blXPuXjzD1OMA==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/element-image': 2.0.0-beta.2 - '@cropper/element-selection': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/element@2.0.0-beta.2: - resolution: {integrity: sha512-i3wfelk5d4MLNgAcQpRa/jOaxWAcDLRAUkiHmU6CMl7xvOAD/4TFQGB3qSpzgx3NK4hUDLn80/gp7gM2nvrBWg==} + /@cropper/element@2.0.0-beta.3: + resolution: {integrity: sha512-Ta1QPx6uqO4WtlvWbQanKSdTi0NptfnSk4h93TSk/GTKYTUI6Qa1g5C+2ibdsomcD/bVTTY6cbuGMFfM8E8zQQ==} dependencies: - '@cropper/utils': 2.0.0-beta.2 + '@cropper/utils': 2.0.0-beta.3 dev: true - /@cropper/elements@2.0.0-beta.2: - resolution: {integrity: sha512-l08CmeOvLJ8XLJ95OQ+kSHSbf7+pHcsu3pvQYjustbrUj0H1vzBiWT8VygPjkCUMoVIfsBpYmBNpWVGJvjoy2Q==} + /@cropper/elements@2.0.0-beta.3: + resolution: {integrity: sha512-oHRnhrFN/S2vadX1/ogaoZQuPUwUxYRoZ+BZjPUxr0kdX4SwumU0pMD2hxVMbveTl0zxFc0S3HdqXx8kcHGPtg==} dependencies: - '@cropper/element': 2.0.0-beta.2 - '@cropper/element-canvas': 2.0.0-beta.2 - '@cropper/element-crosshair': 2.0.0-beta.2 - '@cropper/element-grid': 2.0.0-beta.2 - '@cropper/element-handle': 2.0.0-beta.2 - '@cropper/element-image': 2.0.0-beta.2 - '@cropper/element-selection': 2.0.0-beta.2 - '@cropper/element-shade': 2.0.0-beta.2 - '@cropper/element-viewer': 2.0.0-beta.2 + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-crosshair': 2.0.0-beta.3 + '@cropper/element-grid': 2.0.0-beta.3 + '@cropper/element-handle': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/element-shade': 2.0.0-beta.3 + '@cropper/element-viewer': 2.0.0-beta.3 dev: true - /@cropper/utils@2.0.0-beta.2: - resolution: {integrity: sha512-RJu5IWzH6vcygwLsx9KEqzwjnEqApPkSFViMzxCRbe0IuAXt2ZlSUmYKgLFZY+YJIdaZ+/P7PwiUcZ7GYH3Msw==} + /@cropper/utils@2.0.0-beta.3: + resolution: {integrity: sha512-3oBwFN2DZiqfKzkB+fpAa+LV2izRUpbH0MS427p8rgMb7EEOP/UFaKeq/P/Ovs3dhLbiA48aLiV6GmX9piEmlw==} dev: true /@cspotcode/source-map-consumer@0.8.0: @@ -1794,23 +1811,6 @@ packages: resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.5.2 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/eslintrc@2.0.3: resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1851,17 +1851,6 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/config-array@0.9.5: - resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -1905,7 +1894,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -1926,7 +1915,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -1963,7 +1952,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 jest-mock: 27.5.1 dev: true @@ -1973,7 +1962,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.11.18 + '@types/node': 20.3.1 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -2002,7 +1991,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -2026,6 +2015,13 @@ packages: - supports-color dev: true + /@jest/schemas@29.4.3: + resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.25.24 + dev: true + /@jest/source-map@27.5.1: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2072,7 +2068,7 @@ packages: jest-regex-util: 27.5.1 jest-util: 27.5.1 micromatch: 4.0.5 - pirates: 4.0.5 + pirates: 4.0.6 slash: 3.0.0 source-map: 0.6.1 write-file-atomic: 3.0.3 @@ -2086,7 +2082,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -2209,43 +2205,62 @@ packages: dev: false optional: true - /@microsoft/api-extractor-model@7.15.2: - resolution: {integrity: sha512-qgxKX/s6vo3nCVLhP0Ds7555QrErhcYHEok5/KyEZ7iR8J5M5oldD1eJJQmtEdVF5IzmnPPbxx1nRvfgA674LQ==} - dependencies: - '@microsoft/tsdoc': 0.13.2 - '@microsoft/tsdoc-config': 0.15.2 - '@rushstack/node-core-library': 3.44.3 - dev: true - - /@microsoft/api-extractor@7.19.3: - resolution: {integrity: sha512-GZe+R3K4kh2X425iOHkPbByysB7FN0592mPPA6vNj5IhyhlPHgdZS6m6AmOZOIxMS4euM+SBKzEJEp3oC+WsOQ==} + /@microsoft/api-documenter@7.22.21(@types/node@20.3.1): + resolution: {integrity: sha512-o8VXpB83P87cLIYfkQS7ibShoYorTZ7Xs+gMwftT75pFaYWwhBuI8M0MPgzTGIAxzi338XfUjhctlVCjRn+Sqg==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.15.2 - '@microsoft/tsdoc': 0.13.2 - '@microsoft/tsdoc-config': 0.15.2 - '@rushstack/node-core-library': 3.44.3 - '@rushstack/rig-package': 0.3.7 - '@rushstack/ts-command-line': 4.10.6 + '@microsoft/api-extractor-model': 7.27.3(@types/node@20.3.1) + '@microsoft/tsdoc': 0.14.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + '@rushstack/ts-command-line': 4.15.1 colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.17.0 - semver: 7.3.8 - source-map: 0.6.1 - typescript: 4.5.4 + js-yaml: 3.13.1 + resolve: 1.22.2 + transitivePeerDependencies: + - '@types/node' dev: true - /@microsoft/tsdoc-config@0.15.2: - resolution: {integrity: sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==} + /@microsoft/api-extractor-model@7.27.3(@types/node@20.3.1): + resolution: {integrity: sha512-fSFvw7otYHduOkyshjTbapKKgwF8bgquVHvgF8VgeKtMYvqXkoaj7W6VcM7PNY7E2bbblhUgC4XNdqZLD4SJGw==} dependencies: - '@microsoft/tsdoc': 0.13.2 + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.36.0(@types/node@20.3.1): + resolution: {integrity: sha512-P+kYgJFDXIr+UNzhRMhlpM/dderi6ab4lxn35vdhfAIMPtGCSXIJxrrtpTOQmQW8CZtmoZX06LYoUsKCc1zjow==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.27.3(@types/node@20.3.1) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + '@rushstack/rig-package': 0.4.0 + '@rushstack/ts-command-line': 4.15.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.2 + semver: 7.3.8 + source-map: 0.6.1 + typescript: 5.0.4 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 ajv: 6.12.6 jju: 1.4.0 resolve: 1.19.0 dev: true - /@microsoft/tsdoc@0.13.2: - resolution: {integrity: sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==} + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: true /@mole-inc/bin-wrapper@8.0.1: @@ -2253,7 +2268,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: bin-check: 4.1.0 - bin-version-check: 5.0.0 + bin-version-check: 5.1.0 content-disposition: 0.5.4 ext-name: 5.0.0 file-type: 17.1.6 @@ -2262,6 +2277,11 @@ packages: os-filter-obj: 2.0.0 dev: true + /@msgpack/msgpack@3.0.0-beta2: + resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==} + engines: {node: '>= 14'} + dev: false + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} cpu: [arm64] @@ -2446,7 +2466,7 @@ packages: engines: {node: '>=12.0.0'} dependencies: '@redocly/ajv': 8.11.0 - '@types/node': 14.18.51 + '@types/node': 14.18.52 colorette: 1.4.0 js-levenshtein: 1.1.6 js-yaml: 4.1.0 @@ -2546,29 +2566,33 @@ packages: dev: true optional: true - /@rushstack/node-core-library@3.44.3: - resolution: {integrity: sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w==} + /@rushstack/node-core-library@3.59.4(@types/node@20.3.1): + resolution: {integrity: sha512-YAKJDC6Mz/KA1D7bvB88WaRX3knt/ZuLzkRu5G9QADGSjLtvTWzCNCytRF2PCSaaHOZaZsWul4F1KQdgFgUDqA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true dependencies: - '@types/node': 12.20.24 + '@types/node': 20.3.1 colors: 1.2.5 fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.17.0 + resolve: 1.22.2 semver: 7.3.8 - timsort: 0.3.0 z-schema: 5.0.5 dev: true - /@rushstack/rig-package@0.3.7: - resolution: {integrity: sha512-pzMsTSeTC8IiZ6EJLr53gGMvhT4oLWH+hxD7907cHyWuIUlEXFtu/2pK25vUQT13nKp5DJCWxXyYoGRk/h6rtA==} + /@rushstack/rig-package@0.4.0: + resolution: {integrity: sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==} dependencies: - resolve: 1.17.0 + resolve: 1.22.2 strip-json-comments: 3.1.1 dev: true - /@rushstack/ts-command-line@4.10.6: - resolution: {integrity: sha512-Y3GkUag39sTIlukDg9mUp8MCHrrlJ27POrBNRQGc/uF+VVgX8M7zMzHch5zP6O1QVquWgD7Engdpn2piPYaS/g==} + /@rushstack/ts-command-line@4.15.1: + resolution: {integrity: sha512-EL4jxZe5fhb1uVL/P/wQO+Z8Rc8FMiWJ1G7VgnPDvdIt5GVjRfK7vwzder1CZQiX3x0PY6uxENYLNGTFd1InRQ==} dependencies: '@types/argparse': 1.0.38 argparse: 1.0.10 @@ -2590,6 +2614,10 @@ packages: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} dev: true + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: true + /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -3007,20 +3035,19 @@ packages: /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - /@tsd/typescript@4.5.5: - resolution: {integrity: sha512-TxQ9QiUT94ZjKu++ta/iwTMVHsix4ApohnaHPTSd58WQuTjPIELP0tUYcW7lT6psz7yZiU4eRw+X4v/XV830Sw==} - hasBin: true + /@tsd/typescript@5.0.4: + resolution: {integrity: sha512-YQi2lvZSI+xidKeUjlbv6b6Zw7qB3aXHw5oGJLs5OOGAEqKIOvz5UIAkWyg0bJbkSUWPBEtaOHpVxU4EYBO1Jg==} dev: true /@types/accepts@1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/adm-zip@0.5.0: resolution: {integrity: sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/argparse@1.0.38: @@ -3064,7 +3091,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/bull@3.15.9: resolution: {integrity: sha512-MPUcyPPQauAmynoO3ezHAmCOhbB0pWmYyijr/5ctaCqhbKWsjW0YCod38ZcLzUBprosfZ9dPqfYIcfdKjk7RNQ==} @@ -3080,7 +3107,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/responselike': 1.0.0 /@types/cbor@6.0.0: @@ -3093,14 +3120,14 @@ packages: /@types/co-body@6.1.0: resolution: {integrity: sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/qs': 6.9.7 dev: false /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/content-disposition@0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} @@ -3111,7 +3138,7 @@ packages: '@types/connect': 3.4.35 '@types/express': 4.17.17 '@types/keygrip': 1.0.2 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/disposable-email-domains@1.0.4: resolution: {integrity: sha512-AmKPD8vBZzvey/jeg+YAIH/xJE3D6edOXz+YUooSCcHesGzFyzke83kj1j4d0LUR9nkSHIRklUVdcAMleuWLpg==} @@ -3157,7 +3184,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3168,24 +3195,24 @@ packages: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 + '@types/serve-static': 1.15.2 /@types/fluent-ffmpeg@2.1.20: resolution: {integrity: sha512-B+OvhCdJ3LgEq2PhvWNOiB/EfwnXLElfMCgc4Z1K5zXgSfo9I6uGKwR/lqmNPFQuebNnes7re3gqkV77SyypLg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/formidable@2.0.6: resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: false /@types/glob-stream@8.0.0: resolution: {integrity: sha512-fxTWwdQmX9LWSHD7ZLlv3BHR992mKcVcDnT/2v+l/QZZo7TfDdyasqlSYVzOnMGWhRbrWeWkbj/mgezFjKynhw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/picomatch': 2.3.0 '@types/streamx': 2.9.1 dev: true @@ -3194,26 +3221,26 @@ packages: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/gulp-rename@2.0.1: resolution: {integrity: sha512-9ZjeS2RHEnmBmTcyi2+oeye3BgCsWhvi4uv3qCnAg8i6plOuRdaeNxjOves0ELysEXYLBl7bCl5fbVs7AZtgTA==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/vinyl': 2.0.7 dev: true /@types/gulp-rename@2.0.2: resolution: {integrity: sha512-CQsXqTVtAXqrPd4IbrrlJEEzRkUR3RXsyZbrVoOVqjlchDDmnyRDatAUisjpQjjCg/wjJrSiNg8T1uAbJ/7Qqg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/vinyl': 2.0.7 dev: true @@ -3281,7 +3308,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -3308,7 +3335,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/koa-bodyparser@4.3.10: resolution: {integrity: sha512-6ae05pjhmrmGhUR8GYD5qr5p9LTEMEGfGXCsK8VaSL+totwigm8+H/7MHW7K4854CMeuwRAubT8qcc/EagaeIA==} @@ -3424,7 +3451,7 @@ packages: '@types/http-errors': 2.0.1 '@types/keygrip': 1.0.2 '@types/koa-compose': 3.2.5 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/koa__cors@3.3.0: resolution: {integrity: sha512-FUN8YxcBakIs+walVe3+HcNP+Bxd0SB8BJHBWkglZ5C1XQWljlKcEFDG/dPiCIqwVCUbc5X0nYDlH62uEhdHMA==} @@ -3473,13 +3500,13 @@ packages: /@types/needle@3.2.0: resolution: {integrity: sha512-6XzvzEyJ2ozFNfPajFmqH9JOt0Hp+9TawaYpJT59iIP/zR0U37cfWCRwosyIeEBBZBi021Osq4jGAD3AOju5fg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 form-data: 3.0.1 dev: false @@ -3490,24 +3517,19 @@ packages: node-fetch: 3.3.1 dev: true - /@types/node@12.20.24: - resolution: {integrity: sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==} - dev: true - - /@types/node@14.18.51: - resolution: {integrity: sha512-P9bsdGFPpVtofEKlhWMVS2qqx1A/rt9QBfihWlklfHHpUpjtYse5AzFz6j4DWrARLYh6gRnw9+5+DJcrq3KvBA==} - - /@types/node@17.0.5: - resolution: {integrity: sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==} - dev: true + /@types/node@14.18.52: + resolution: {integrity: sha512-DGhiXKOHSFVVm+PJD+9Y0ObxXLeG6qwc0HoOn+ooQKeNNu+T2mEJCM5UBDUREKAggl9MHYjb5E71PAmx6MbzIg==} /@types/node@18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + /@types/node@20.3.1: + resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + /@types/nodemailer@6.4.8: resolution: {integrity: sha512-oVsJSCkqViCn8/pEu2hfjwVO+Gb3e+eTWjg3PcjeFKRItfKpKwHphQqbYmPQrlMk+op7pNNWPbsJIEthpFN/OQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/normalize-package-data@2.4.1: @@ -3517,7 +3539,7 @@ packages: /@types/oauth@0.9.1: resolution: {integrity: sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/offscreencanvas@2019.3.0: resolution: {integrity: sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==} @@ -3539,7 +3561,7 @@ packages: resolution: {integrity: sha512-R5H3vw62gHNHrn+JGZbKejb+Z2D/6E5UNVlhCzIaBBLroMQMOFqy5Pap2gM+ZZHdqBtVU0/cx/M6to+mOJcoew==} dependencies: '@types/needle': 3.2.0 - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/pug@2.0.6: @@ -3553,7 +3575,7 @@ packages: /@types/qrcode@1.5.0: resolution: {integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/qs@6.9.7: @@ -3573,7 +3595,7 @@ packages: /@types/redis@2.8.32: resolution: {integrity: sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/redis@4.0.11: @@ -3590,7 +3612,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/sanitize-html@2.9.0: resolution: {integrity: sha512-4fP/kEcKNj2u39IzrxWYuf/FnCCwwQCpif6wwY6ROUS1EPRIfWJjGkY3HIowY1EX/VbX5e86yq8AAE7UPMgATg==} @@ -3614,18 +3636,19 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 18.11.18 + '@types/node': 20.3.1 - /@types/serve-static@1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + /@types/serve-static@1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} dependencies: + '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/sharp@0.31.1: resolution: {integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/sinonjs__fake-timers@8.1.1: @@ -3647,7 +3670,7 @@ packages: /@types/streamx@2.9.1: resolution: {integrity: sha512-9bywzhouyedmci7WCIPFwJ8zASDnxt2gaVUy52X0p0Tt085IJSAEP0L6j4SSNeDMSLzpYu6cPz0GrJZ7kPJ6Bg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/throttle-debounce@5.0.0: @@ -3673,7 +3696,7 @@ packages: /@types/undertaker@1.2.8: resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/undertaker-registry': 1.0.1 async-done: 1.3.2 dev: true @@ -3686,7 +3709,7 @@ packages: resolution: {integrity: sha512-ctNcmmzbMIKooXjRkyyUCOu2Z4AyqibL+RhXoF3pb7K7j+ezItnakmpm31LymkYHSIM5ey0tjIFzTvFOTSBCGw==} dependencies: '@types/glob-stream': 8.0.0 - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/vinyl': 2.0.7 dev: true @@ -3694,13 +3717,13 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/web-push@3.3.2: resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/webgl-ext@0.0.30: @@ -3714,13 +3737,13 @@ packages: /@types/websocket@1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -3736,116 +3759,10 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true optional: true - /@typescript-eslint/eslint-plugin@5.8.1(@typescript-eslint/parser@5.8.1)(eslint@8.6.0)(typescript@4.5.4): - resolution: {integrity: sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/experimental-utils': 5.8.1(eslint@8.6.0)(typescript@4.5.4) - '@typescript-eslint/parser': 5.8.1(eslint@8.6.0)(typescript@4.5.4) - '@typescript-eslint/scope-manager': 5.8.1 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.6.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.4 - regexpp: 3.2.0 - semver: 7.5.1 - tsutils: 3.21.0(typescript@4.5.4) - typescript: 4.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/experimental-utils@5.8.1(eslint@8.6.0)(typescript@4.5.4): - resolution: {integrity: sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.12 - '@typescript-eslint/scope-manager': 5.8.1 - '@typescript-eslint/types': 5.8.1 - '@typescript-eslint/typescript-estree': 5.8.1(typescript@4.5.4) - eslint: 8.6.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.6.0) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/parser@5.8.1(eslint@8.6.0)(typescript@4.5.4): - resolution: {integrity: sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.8.1 - '@typescript-eslint/types': 5.8.1 - '@typescript-eslint/typescript-estree': 5.8.1(typescript@4.5.4) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.6.0 - typescript: 4.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.8.1: - resolution: {integrity: sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.8.1 - '@typescript-eslint/visitor-keys': 5.8.1 - dev: true - - /@typescript-eslint/types@5.8.1: - resolution: {integrity: sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.8.1(typescript@4.5.4): - resolution: {integrity: sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.8.1 - '@typescript-eslint/visitor-keys': 5.8.1 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.1 - tsutils: 3.21.0(typescript@4.5.4) - typescript: 4.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/visitor-keys@5.8.1: - resolution: {integrity: sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.8.1 - eslint-visitor-keys: 3.4.1 - dev: true - /@vitejs/plugin-vue@4.2.3(vite@4.3.9)(vue@3.3.4): resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4138,24 +4055,24 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 dev: false - /acorn-import-assertions@1.9.0(acorn@8.8.2): + /acorn-import-assertions@1.9.0(acorn@8.9.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.2 + acorn: 8.9.0 dev: true - /acorn-jsx@5.3.2(acorn@8.8.2): + /acorn-jsx@5.3.2(acorn@8.9.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.9.0 /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} @@ -4171,8 +4088,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn@8.9.0: + resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -4584,12 +4501,6 @@ packages: stream-exhaust: 1.0.2 dev: true - /async-mutex@0.4.0: - resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} - dependencies: - tslib: 2.5.3 - dev: false - /async-settle@1.0.0: resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} engines: {node: '>= 0.10'} @@ -4621,14 +4532,14 @@ packages: /autolinker@4.0.0: resolution: {integrity: sha512-fl5Kh6BmEEZx+IWBfEirnRUU5+cOiV0OK7PEt0RBKvJMJ8GaRseIOeDU3FKf4j3CE5HVefcjHmhYPOcaVt0bZw==} dependencies: - tslib: 2.5.3 + tslib: 2.6.0 dev: false /autoprefixer@6.7.7: resolution: {integrity: sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ==} dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001502 + caniuse-db: 1.0.30001509 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -4655,7 +4566,7 @@ packages: '@ava/typescript': optional: true dependencies: - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 ansi-styles: 6.2.1 arrgv: 1.0.2 @@ -4677,7 +4588,7 @@ packages: del: 7.0.0 emittery: 1.0.1 figures: 5.0.0 - globby: 13.1.4 + globby: 13.2.0 ignore-by-default: 2.1.0 indent-string: 5.0.0 is-error: 2.2.2 @@ -4923,13 +4834,13 @@ packages: executable: 4.1.1 dev: true - /bin-version-check@5.0.0: - resolution: {integrity: sha512-Q3FMQnS5eZmrBGqmDXLs4dbAn/f+52voP6ykJYmweSA60t6DyH4UTSwZhtbK5UH+LBoWvDljILUQMLRUtsynsA==} + /bin-version-check@5.1.0: + resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} engines: {node: '>=12'} dependencies: bin-version: 6.0.0 - semver: 7.5.1 - semver-truncate: 2.0.0 + semver: 7.5.3 + semver-truncate: 3.0.0 dev: true /bin-version@6.0.0: @@ -5041,19 +4952,19 @@ packages: deprecated: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools. hasBin: true dependencies: - caniuse-db: 1.0.30001502 - electron-to-chromium: 1.4.430 + caniuse-db: 1.0.30001509 + electron-to-chromium: 1.4.442 dev: true - /browserslist@4.21.8: - resolution: {integrity: sha512-j+7xYe+v+q2Id9qbBeCI8WX5NmZSRe8es1+0xntD/+gaWXznP8tFEkv5IgSaHf5dS1YwVMbX/4W6m937mj+wQw==} + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001502 - electron-to-chromium: 1.4.430 + caniuse-lite: 1.0.30001509 + electron-to-chromium: 1.4.442 node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.8) + update-browserslist-db: 1.0.11(browserslist@4.21.9) /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -5151,7 +5062,7 @@ packages: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.2 - glob: 10.2.7 + glob: 10.3.1 lru-cache: 7.18.3 minipass: 5.0.0 minipass-collect: 1.0.2 @@ -5195,8 +5106,8 @@ packages: engines: {node: '>=14.16'} dev: false - /cacheable-request@10.2.10: - resolution: {integrity: sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==} + /cacheable-request@10.2.12: + resolution: {integrity: sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==} engines: {node: '>=14.16'} dependencies: '@types/http-cache-semantics': 4.0.1 @@ -5267,17 +5178,17 @@ packages: resolution: {integrity: sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q==} dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001502 + caniuse-db: 1.0.30001509 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-db@1.0.30001502: - resolution: {integrity: sha512-nNj61ClInBeMsDqHo20wgMJ40Jhyg9l6W0Z9tipmsc99g43TGvlJky4LP3TlrXbLrVCzRWVS4Gox606M6Hw9Ow==} + /caniuse-db@1.0.30001509: + resolution: {integrity: sha512-Gf3pFp97loixG5w83NVb09DMI+WzkVXLn4H2abxv7DXxHUyKYbZc5qpEqAQy/mDFO6bAnNQh4hZ8lLeGlPTZQg==} dev: true - /caniuse-lite@1.0.30001502: - resolution: {integrity: sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg==} + /caniuse-lite@1.0.30001509: + resolution: {integrity: sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==} /canonicalize@1.0.8: resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==} @@ -6122,8 +6033,8 @@ packages: /cropperjs@2.0.0-beta.2: resolution: {integrity: sha512-jDRSODDGKmi9vp3p/+WXkxMqV/AE+GpSld1U3cHZDRdLy9UykRzurSe8k1dR0TExn45ygCMrv31qkg+K3EeXXw==} dependencies: - '@cropper/elements': 2.0.0-beta.2 - '@cropper/utils': 2.0.0-beta.2 + '@cropper/elements': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 dev: true /cross-env@7.0.3: @@ -6270,7 +6181,7 @@ packages: dependencies: '@cypress/request': 2.88.11 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 14.18.51 + '@types/node': 14.18.52 '@types/sinonjs__fake-timers': 8.1.1 '@types/sizzle': 2.3.3 arch: 2.2.0 @@ -6531,7 +6442,7 @@ packages: resolution: {integrity: sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==} engines: {node: '>=14.16'} dependencies: - globby: 13.1.4 + globby: 13.2.0 graceful-fs: 4.2.11 is-glob: 4.0.3 is-path-cwd: 3.0.0 @@ -6594,6 +6505,11 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -6695,8 +6611,8 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 - /dotenv@16.1.4: - resolution: {integrity: sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==} + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} dev: false @@ -6755,8 +6671,8 @@ packages: dependencies: jake: 10.8.7 - /electron-to-chromium@1.4.430: - resolution: {integrity: sha512-FytjTbGwz///F+ToZ5XSeXbbSaXalsVRXsz2mHityI5gfxft7ieW3HqFLkU5V1aIrY42aflICqbmFoDxW10etg==} + /electron-to-chromium@1.4.442: + resolution: {integrity: sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q==} /emittery@0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} @@ -6833,8 +6749,8 @@ packages: engines: {node: '>=6'} dev: false - /envinfo@7.8.1: - resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + /envinfo@7.10.0: + resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} engines: {node: '>=4'} hasBin: true dev: true @@ -7000,26 +6916,11 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-utils@3.0.0(eslint@8.6.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.6.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: false - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - /eslint-visitor-keys@3.4.1: resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7064,66 +6965,19 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - /eslint@8.6.0: - resolution: {integrity: sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.9.5 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - enquirer: 2.3.6 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-utils: 3.0.0(eslint@8.6.0) - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 6.0.2 - globals: 13.20.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - progress: 2.0.3 - regexpp: 3.2.0 - semver: 7.5.1 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - v8-compile-cache: 2.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /espree@9.5.2: resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) eslint-visitor-keys: 3.4.1 /esprima@2.7.3: @@ -7677,7 +7531,7 @@ packages: /focus-trap@7.4.3: resolution: {integrity: sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==} dependencies: - tabbable: 6.1.2 + tabbable: 6.2.0 dev: true /follow-redirects@1.15.2(debug@4.3.4): @@ -7756,8 +7610,8 @@ packages: dependencies: fetch-blob: 3.2.0 - /formidable@2.1.1: - resolution: {integrity: sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==} + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 @@ -7877,10 +7731,6 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -8063,16 +7913,16 @@ packages: - supports-color dev: true - /glob@10.2.7: - resolution: {integrity: sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA==} + /glob@10.3.1: + resolution: {integrity: sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.2.1 - minimatch: 9.0.1 + minimatch: 9.0.2 minipass: 5.0.0 - path-scurry: 1.9.2 + path-scurry: 1.10.0 dev: false /glob@7.2.0: @@ -8155,8 +8005,8 @@ packages: slash: 3.0.0 dev: true - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + /globby@13.2.0: + resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 @@ -8207,7 +8057,7 @@ packages: '@sindresorhus/is': 5.4.1 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.10 + cacheable-request: 10.2.12 decompress-response: 6.0.0 form-data-encoder: 2.1.4 get-stream: 6.0.1 @@ -8273,7 +8123,7 @@ packages: resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==} engines: {node: '>=10'} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 '@types/vinyl': 2.0.7 istextorbinary: 3.3.0 replacestream: 4.0.3 @@ -8285,7 +8135,7 @@ packages: engines: {node: '>=10'} dependencies: plugin-error: 1.0.1 - terser: 5.18.0 + terser: 5.18.2 through2: 4.0.2 vinyl-sourcemaps-apply: 0.2.1 dev: true @@ -8677,11 +8527,6 @@ packages: engines: {node: '>=10 <11 || >=12 <13 || >=14'} dev: true - /ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - dev: true - /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -9305,7 +9150,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -9388,7 +9233,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.4.0(@types/node@17.0.5)(typescript@4.5.4) + ts-node: 10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3) transitivePeerDependencies: - bufferutil - canvas @@ -9406,6 +9251,16 @@ packages: pretty-format: 27.5.1 dev: true + /jest-diff@29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + /jest-docblock@27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9431,7 +9286,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -9449,7 +9304,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true @@ -9468,13 +9323,18 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true + /jest-get-type@29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /jest-haste-map@27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.6 - '@types/node': 18.11.18 + '@types/node': 20.3.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9496,7 +9356,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -9551,7 +9411,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 dev: true /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): @@ -9607,7 +9467,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -9664,7 +9524,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 graceful-fs: 4.2.11 dev: true @@ -9703,7 +9563,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -9728,7 +9588,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.18 + '@types/node': 20.3.1 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -9748,7 +9608,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.18 + '@types/node': 20.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -9831,6 +9691,14 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + /js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -9875,7 +9743,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 + acorn: 8.9.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -9917,7 +9785,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 + acorn: 8.9.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -9984,7 +9852,7 @@ packages: dependencies: json5: 2.2.3 loader-utils: 2.0.4 - schema-utils: 3.2.0 + schema-utils: 3.3.0 webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true @@ -10132,7 +10000,7 @@ packages: '@types/formidable': 2.0.6 '@types/koa': 2.13.5 co-body: 6.1.0 - formidable: 2.1.1 + formidable: 2.1.2 zod: 3.21.4 dev: false @@ -10621,6 +10489,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /lru-cache@10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -10643,11 +10516,6 @@ packages: engines: {node: '>=12'} dev: false - /lru-cache@9.1.2: - resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} - engines: {node: 14 || >=16.14} - dev: false - /luxon@3.3.0: resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} engines: {node: '>=12'} @@ -10923,8 +10791,8 @@ packages: dependencies: brace-expansion: 2.0.1 - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + /minimatch@9.0.2: + resolution: {integrity: sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -11630,16 +11498,16 @@ packages: type-check: 0.3.2 word-wrap: 1.2.3 - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.5 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 /ordered-read-streams@1.0.1: resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} @@ -11928,11 +11796,11 @@ packages: path-root-regex: 0.1.2 dev: true - /path-scurry@1.9.2: - resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==} + /path-scurry@1.10.0: + resolution: {integrity: sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 9.1.2 + lru-cache: 10.0.0 minipass: 5.0.0 dev: false @@ -11971,14 +11839,14 @@ packages: /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - /pg-cloudflare@1.1.0: - resolution: {integrity: sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==} + /pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} requiresBuild: true dev: false optional: true - /pg-connection-string@2.6.0: - resolution: {integrity: sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==} + /pg-connection-string@2.6.1: + resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} dev: false /pg-int8@1.0.1: @@ -11986,8 +11854,8 @@ packages: engines: {node: '>=4.0.0'} dev: false - /pg-pool@3.6.0(pg@8.11.0): - resolution: {integrity: sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==} + /pg-pool@3.6.1(pg@8.11.0): + resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} peerDependencies: pg: '>=8.0' dependencies: @@ -12020,13 +11888,13 @@ packages: dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 - pg-connection-string: 2.6.0 - pg-pool: 3.6.0(pg@8.11.0) + pg-connection-string: 2.6.1 + pg-pool: 3.6.1(pg@8.11.0) pg-protocol: 1.6.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.1.0 + pg-cloudflare: 1.1.1 dev: false /pgpass@1.0.5: @@ -12068,8 +11936,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} dev: true @@ -12442,6 +12310,15 @@ packages: react-is: 17.0.2 dev: true + /pretty-format@29.5.0: + resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /pretty-hrtime@1.0.3: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} @@ -12501,6 +12378,8 @@ packages: /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + dev: false + optional: true /promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} @@ -12823,6 +12702,10 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + /read-pkg-up@1.0.1: resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} engines: {node: '>=0.10.0'} @@ -12952,6 +12835,18 @@ packages: dependencies: redis-errors: 1.2.0 + /redis-semaphore@5.3.1(ioredis@5.3.2): + resolution: {integrity: sha512-oUpxxfxSbh5eT0mvVpz2d4Qlg2CsaoQkeo80/v6CU2l97zO0u6NPgc9/zQZa9KGR3/93b0igtSct3hEFh8Ei8w==} + engines: {node: '>= 14.17.0'} + peerDependencies: + ioredis: ^4.1.0 || ^5 + dependencies: + debug: 4.3.4(supports-color@8.1.1) + ioredis: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + /redis@4.6.7: resolution: {integrity: sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==} dependencies: @@ -12992,11 +12887,6 @@ packages: safe-regex: 1.1.0 dev: true - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - /remove-bom-buffer@3.0.0: resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} engines: {node: '>=0.10.0'} @@ -13166,12 +13056,6 @@ packages: engines: {node: '>=10'} dev: true - /resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - dependencies: - path-parse: 1.0.7 - dev: true - /resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} dependencies: @@ -13282,7 +13166,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.3 + tslib: 2.6.0 dev: true /s-age@1.1.2: @@ -13346,8 +13230,8 @@ packages: xmlchars: 2.2.0 dev: false - /schema-utils@3.2.0: - resolution: {integrity: sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==} + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.12 @@ -13377,11 +13261,11 @@ packages: engines: {node: '>=12'} dev: true - /semver-truncate@2.0.0: - resolution: {integrity: sha512-Rh266MLDYNeML5h90ttdMwfXe1+Nc4LAWd9X1KdJe8pPHP4kFmvLZALtsMNHNdvTyQygbEC0D59sIz47DIaq8w==} - engines: {node: '>=8'} + /semver-truncate@3.0.0: + resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} + engines: {node: '>=12'} dependencies: - semver: 6.3.0 + semver: 7.5.1 dev: true /semver@5.7.1: @@ -13407,6 +13291,14 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} @@ -14135,8 +14027,8 @@ packages: resolution: {integrity: sha512-g9rPT3V1Q4WjWFZ/t5BdGC1mT/FpYnsLdBl+M5e6MlRkuE1RSR+R43wcY/3mKI59B9KEr+vxdWCuWNMD3oNHKA==} dev: true - /tabbable@6.1.2: - resolution: {integrity: sha512-qCN98uP7i9z0fIS4amQ5zbGBOq+OSigYeGvPy7NDk8Y9yncqDZ9pRPgfsc2PJIVM9RrJj7GIfuRgmjoUU9zTHQ==} + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: true /tapable@2.2.1: @@ -14222,19 +14114,19 @@ packages: '@jridgewell/trace-mapping': 0.3.18 '@swc/core': 1.3.62 jest-worker: 27.5.1 - schema-utils: 3.2.0 + schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.18.0 + terser: 5.18.2 webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true - /terser@5.18.0: - resolution: {integrity: sha512-pdL757Ig5a0I+owA42l6tIuEycRuM7FPY4n62h44mRLRfnOxJkkOHd6i89dOpwZlpF6JXBwaAHF6yWzFrt+QyA==} + /terser@5.18.2: + resolution: {integrity: sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 + acorn: 8.9.0 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -14352,10 +14244,6 @@ packages: engines: {node: '>=4'} dev: true - /timsort@0.3.0: - resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} - dev: true - /tinycolor2@1.5.2: resolution: {integrity: sha512-h80m9GPFGbcLzZByXlNSEhp1gf8Dy+VX/2JCGUZsWLo7lV1mnE/XlxGYgRBoMLJh1lIDXP0EMC4RPTjlRaV+Bg==} @@ -14482,7 +14370,7 @@ packages: escape-string-regexp: 5.0.0 dev: true - /ts-jest@27.1.2(@babel/core@7.22.5)(@types/jest@27.4.0)(jest@27.4.5)(typescript@4.5.4): + /ts-jest@27.1.2(@babel/core@7.22.5)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3): resolution: {integrity: sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -14513,7 +14401,7 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.1 - typescript: 4.5.4 + typescript: 5.1.3 yargs-parser: 20.2.9 dev: true @@ -14532,7 +14420,7 @@ packages: webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) dev: true - /ts-node@10.4.0(@types/node@17.0.5)(typescript@4.5.4): + /ts-node@10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3): resolution: {integrity: sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==} hasBin: true peerDependencies: @@ -14547,18 +14435,19 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.7.0 + '@swc/core': 1.3.62 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 17.0.5 - acorn: 8.8.2 + '@types/node': 20.3.1 + acorn: 8.9.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.5.4 + typescript: 5.1.3 yn: 3.1.1 dev: true @@ -14583,7 +14472,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.11.18 - acorn: 8.8.2 + acorn: 8.9.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -14614,41 +14503,28 @@ packages: strip-bom: 3.0.0 dev: true - /tsd@0.19.1: - resolution: {integrity: sha512-pSwchclr+ADdxlahRUQXUrdAIOjXx1T1PQV+fLfVLuo/S4z+T00YU84fH8iPlZxyA2pWgJjo42BG1p9SDb4NOw==} - engines: {node: '>=12'} + /tsd@0.28.1: + resolution: {integrity: sha512-FeYrfJ05QgEMW/qOukNCr4fAJHww4SaKnivAXRv4g5kj4FeLpNV7zH4dorzB9zAfVX4wmA7zWu/wQf7kkcvfbw==} + engines: {node: '>=14.16'} hasBin: true dependencies: - '@tsd/typescript': 4.5.5 + '@tsd/typescript': 5.0.4 eslint-formatter-pretty: 4.1.0 globby: 11.1.0 + jest-diff: 29.5.0 meow: 9.0.0 path-exists: 4.0.0 read-pkg-up: 7.0.1 dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + /tslib@2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} /tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} dev: false - /tsutils@3.21.0(typescript@4.5.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 4.5.4 - dev: true - /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: @@ -14792,7 +14668,7 @@ packages: cli-highlight: 2.1.11 date-fns: 2.30.0 debug: 4.3.4(supports-color@8.1.1) - dotenv: 16.1.4 + dotenv: 16.3.1 glob: 7.2.3 ioredis: 5.3.2 js-yaml: 4.1.0 @@ -14801,7 +14677,7 @@ packages: reflect-metadata: 0.1.13 sha.js: 2.4.11 ts-node: 10.9.1(@swc/core@1.3.62)(@types/node@18.11.18)(typescript@5.1.3) - tslib: 2.5.3 + tslib: 2.6.0 uuid: 8.3.2 xml2js: 0.4.23 yargs: 17.7.2 @@ -14809,17 +14685,17 @@ packages: - supports-color dev: false - /typescript@4.5.4: - resolution: {integrity: sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - /typescript@4.9.4: resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + /typescript@5.1.3: resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} engines: {node: '>=14.17'} @@ -14863,6 +14739,10 @@ packages: busboy: 1.6.0 dev: false + /unicode-emoji-json@0.4.0: + resolution: {integrity: sha512-lVNOwh2AnmbwqtSrEVjAWKQoVzWgyWmXVqPuPkPfKb0tnA0+uYN/4ILCTdy9IRj/+3drAVhmjwjNJQr2dhCwnA==} + dev: true + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -14936,13 +14816,13 @@ packages: engines: {node: '>=8'} dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.8): + /update-browserslist-db@1.0.11(browserslist@4.21.9): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.8 + browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 @@ -15029,10 +14909,6 @@ packages: /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - /v8-compile-cache@2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true - /v8-to-istanbul@8.1.1: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} @@ -15353,7 +15229,7 @@ packages: colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 - envinfo: 7.8.1 + envinfo: 7.10.0 fastest-levenshtein: 1.0.16 import-local: 3.1.0 interpret: 3.1.1 @@ -15390,9 +15266,9 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.8.2 - acorn-import-assertions: 1.9.0(acorn@8.8.2) - browserslist: 4.21.8 + acorn: 8.9.0 + acorn-import-assertions: 1.9.0(acorn@8.9.0) + browserslist: 4.21.9 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.3.0 @@ -15404,7 +15280,7 @@ packages: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.2.0 + schema-utils: 3.3.0 tapable: 2.2.1 terser-webpack-plugin: 5.3.9(@swc/core@1.3.62)(webpack@5.85.1) watchpack: 2.4.0 @@ -15894,3 +15770,9 @@ packages: rangetouch: 2.0.1 url-polyfill: 1.1.12 dev: true + + github.com/thatonecalculator/emojilib/06944984a61ee799b7083894258f5fa318d932d1: + resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/06944984a61ee799b7083894258f5fa318d932d1} + name: emojilib + version: 3.0.10 + dev: true diff --git a/rome.json b/rome.json index 37d738b553..9b463ea411 100644 --- a/rome.json +++ b/rome.json @@ -14,7 +14,6 @@ "packages/backend/src/server/web/manifest.ts", "packages/backend/built/", "*/model.json", - "packages/client/src/emojilist.json", "*.md", "**/tsconfig.json", "*/.yml" diff --git a/scripts/build-greet.js b/scripts/build-greet.js new file mode 100644 index 0000000000..4b119b0c9f --- /dev/null +++ b/scripts/build-greet.js @@ -0,0 +1,15 @@ +const chalk = require("chalk"); + +const themeColor = chalk.hex("#31748f"); +console.log(themeColor(" ___ _ _ ")); +console.log(themeColor(" / __\\__ _| | ___| | _____ _ _ ")); +console.log(themeColor(" / / / _` | |/ __| |/ / _ | | |")); +console.log(themeColor("/ /__| (_| | | (__| < __/ |_| |")); +console.log(themeColor("\\____/\\__,_|_|\\___|_|\\_\\___|\\__, |")); +console.log(themeColor(" (___/ ")); + +console.log(" Currently building Calckey!"); +console.log( + chalk.rgb(255, 136, 0)(" Hang on for a moment, as this may take a while."), +); +console.log(""); diff --git a/scripts/clean-all.js b/scripts/clean-all.js index c3d85bf3a5..c5fc658499 100644 --- a/scripts/clean-all.js +++ b/scripts/clean-all.js @@ -1,26 +1,65 @@ -const fs = require('fs'); -const execa = require('execa'); +const fs = require("node:fs"); +const execa = require("execa"); +const { join } = require("node:path"); (async () => { - fs.rmSync(__dirname + '/../packages/backend/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/backend/node_modules', { recursive: true, force: true }); - - fs.rmSync(__dirname + '/../packages/client/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/client/node_modules', { recursive: true, force: true }); - - fs.rmSync(__dirname + '/../packages/sw/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/sw/node_modules', { recursive: true, force: true }); - - fs.rmSync(__dirname + '/../built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../node_modules', { recursive: true, force: true }); - - execa('pnpm', ['store', 'prune'], { - cwd: __dirname + '/../', - stdio: 'inherit' + fs.rmSync(join(__dirname, "/../packages/backend/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/node_modules"), { + recursive: true, + force: true, }); - execa('cargo', ['clean'], { - cwd: __dirname + '/../packages/backend/native-utils', - stdio: 'inherit' + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../packages/client/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/client/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../packages/sw/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/sw/node_modules"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/calckey-js/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/calckey-js/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true }); + fs.rmSync(join(__dirname, "/../node_modules"), { + recursive: true, + force: true, + }); + + execa("pnpm", ["store", "prune"], { + cwd: join(__dirname, "/../"), + stdio: "inherit", + }); + + execa("cargo", ["clean"], { + cwd: join(__dirname, "/../packages/backend/native-utils"), + stdio: "inherit", }); })(); diff --git a/scripts/clean.js b/scripts/clean.js index 70b9d882b5..39cbc77b90 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -1,8 +1,27 @@ -const fs = require('fs'); +const fs = require("node:fs"); +const execa = require("execa"); +const { join } = require("node:path"); (async () => { - fs.rmSync(__dirname + '/../packages/backend/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/client/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/sw/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../built', { recursive: true, force: true }); + fs.rmSync(join(__dirname, "/../packages/backend/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/client/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/sw/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/calckey-js/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true }); })(); diff --git a/scripts/dev.js b/scripts/dev.js index 7a61070f5c..0d6a05fe20 100644 --- a/scripts/dev.js +++ b/scripts/dev.js @@ -1,45 +1,45 @@ -const execa = require('execa'); +const execa = require("execa"); (async () => { - await execa('pnpm', ['clean'], { - cwd: __dirname + '/../', + await execa("pnpm", ["clean"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['dlx', 'gulp', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["dlx", "gulp", "watch"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'backend', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "backend", "watch"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'client', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "client", "watch"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'sw', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "sw", "watch"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); const start = async () => { try { - await execa('pnpm', ['start'], { - cwd: __dirname + '/../', + await execa("pnpm", ["start"], { + cwd: __dirname + "/../", stdout: process.stdout, stderr: process.stderr, }); } catch (e) { - await new Promise(resolve => setTimeout(resolve, 3000)); + await new Promise((resolve) => setTimeout(resolve, 3000)); start(); } };